public void ValidateStackLayoutDisabledVirtualizationWithItemsRepeater() { RunOnUIThread.Execute(() => { var repeater = new ItemsRepeater(); var stackLayout = new StackLayout(); stackLayout.DisableVirtualization = true; repeater.Layout = stackLayout; repeater.ItemsSource = Enumerable.Range(0, 10); repeater.ItemTemplate = (DataTemplate)XamlReader.Load( @"<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'> <Button Content='{Binding}' Height='100' /> </DataTemplate>"); var scrollViewer = new ScrollViewer() { Content = repeater }; scrollViewer.Height = 100; Content = scrollViewer; Content.UpdateLayout(); for (int i = 0; i < repeater.ItemsSourceView.Count; i++) { var child = repeater.TryGetElement(i) as Button; Verify.IsNotNull(child); } }); }
private ItemsRepeater SetupRepeater(object dataSource, string itemContent = @"<Button Content='{Binding}' Height='100' />") { VirtualizingLayout layout = null; RunOnUIThread.Execute(() => layout = new StackLayout()); ScrollViewer scrollViewer = null; return(SetupRepeater(dataSource, layout, itemContent, out scrollViewer)); }
public void VerifySwitchingLayoutDynamically() { LayoutPanel panel = null; Button button1 = null; Button button2 = null; RunOnUIThread.Execute(() => { Log.Comment("Create LayoutPanel with StackLayout"); panel = new LayoutPanel() { Width = 400, Height = 400 }; var stackLayout = new StackLayout { Orientation = Orientation.Vertical }; panel.Layout = stackLayout; button1 = new Button { Height = 100, Content = "1" }; button2 = new Button { Height = 100, Content = "2" }; panel.Children.Add(button1); panel.Children.Add(button2); Content = panel; Content.UpdateLayout(); Log.Comment("Verify layout for StackLayout:"); Verify.AreEqual(new Rect(0, 0, 400, 100), LayoutInformation.GetLayoutSlot(button1), "Verify LayoutSlot of child 1"); Verify.AreEqual(new Rect(0, 100, 400, 100), LayoutInformation.GetLayoutSlot(button2), "Verify LayoutSlot of child 2"); }); IdleSynchronizer.Wait(); RunOnUIThread.Execute(() => { Log.Comment("Switch LayoutPanel to UniformGridLayout"); UniformGridLayout gridLayout = new UniformGridLayout(); gridLayout.MinItemWidth = 100; gridLayout.MinItemHeight = 100; panel.Layout = gridLayout; Content.UpdateLayout(); Log.Comment("Verify layout for UniformGridLayout:"); Verify.AreEqual(new Rect(0, 0, 100, 100), LayoutInformation.GetLayoutSlot(button1), "Verify LayoutSlot of child 1"); Verify.AreEqual(new Rect(100, 0, 100, 100), LayoutInformation.GetLayoutSlot(button2), "Verify LayoutSlot of child 2"); }); }
public void ValidateRecycledElementOwnerAffinity() { RunOnUIThread.Execute(() => { ItemsRepeater repeater1 = null; ItemsRepeater repeater2 = null; const int numItems = 10; var dataCollection = new ObservableCollection <int>(Enumerable.Range(0, numItems)); const string recycleKey = "key"; var dataSource = MockItemsSource.CreateDataSource <int>(dataCollection, true); var layout = new StackLayout(); var recyclePool = new RecyclePool(); var itemTemplate = (DataTemplate)XamlReader.Load( @"<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'> <TextBlock Text='{Binding}' /> </DataTemplate>"); repeater1 = new ItemsRepeater() { ItemsSource = dataSource, Layout = layout, #if BUILD_WINDOWS ItemTemplate = (Windows.UI.Xaml.IElementFactory) new RecyclingElementFactoryDerived() #else ItemTemplate = new RecyclingElementFactoryDerived() #endif { Templates = { { "key", itemTemplate } }, RecyclePool = recyclePool, SelectTemplateIdFunc = (object data, UIElement owner) => recycleKey } }; repeater2 = new ItemsRepeater() { ItemsSource = dataSource, Layout = layout, #if BUILD_WINDOWS ItemTemplate = (Windows.UI.Xaml.IElementFactory) new RecyclingElementFactoryDerived() #else ItemTemplate = new RecyclingElementFactoryDerived() #endif { Templates = { { "key", itemTemplate } }, RecyclePool = recyclePool, SelectTemplateIdFunc = (object data, UIElement owner) => recycleKey } }; var root = new StackPanel(); root.Children.Add(repeater1); root.Children.Add(repeater2); Content = new ScrollAnchorProvider() { Width = 400, Height = 400, Content = new ScrollViewer() { Content = root } }; Content.UpdateLayout(); Verify.AreEqual(numItems, VisualTreeHelper.GetChildrenCount(repeater1)); Verify.AreEqual(numItems, VisualTreeHelper.GetChildrenCount(repeater2)); // Throw all the elements into the recycle pool dataCollection.Clear(); Content.UpdateLayout(); for (int i = 0; i < numItems; i++) { var element1 = (FrameworkElement)recyclePool.TryGetElement(recycleKey, repeater1); Verify.AreSame(repeater1, element1.Parent); var element2 = (FrameworkElement)recyclePool.TryGetElement(recycleKey, repeater2); Verify.AreSame(repeater2, element2.Parent); } }); }