public async Task ValidateReyclingElementFactoryWithNoTemplate() { await RunOnUIThread.ExecuteAsync(async() => { var elementFactory = new RecyclingElementFactoryDerived() { RecyclePool = new RecyclePool() }; Verify.Throws < #if HAS_UNO // Uno throws a more specific exception InvalidOperationException #else COMException #endif >(delegate { var context = (ElementFactoryGetArgs)RepeaterTestHooks.CreateRepeaterElementFactoryGetArgs(); context.Parent = null; context.Data = 0; elementFactory.GetElement(context); }); }); }
public async Task ValidateRecyclingElementFactoryWithSingleTemplate() { await RunOnUIThread.ExecuteAsync(async() => { var itemTemplate = (DataTemplate)XamlReader.Load( @"<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'> <TextBlock Text='uninitialized' /> </DataTemplate>" ); ItemsRepeater repeater = null; const int numItems = 10; var elementFactory = new RecyclingElementFactoryDerived() { Templates = { { "key", itemTemplate } }, RecyclePool = new RecyclePool(), GetElementFunc = delegate(int index, UIElement owner, UIElement elementFromBase) { ((TextBlock)elementFromBase).Text = index.ToString(); return(elementFromBase); }, ClearElementFunc = delegate(UIElement element, UIElement owner) { ((TextBlock)element).Text = "uninitialized"; }, }; elementFactory.SelectTemplateKey += delegate(RecyclingElementFactory sender, SelectTemplateEventArgs args) { Verify.Fail("SelectTemplateKey event should not be raised when using a single template"); }; Content = CreateAndInitializeRepeater ( itemsSource: Enumerable.Range(0, numItems).Select(i => string.Format("Item #{0}", i)), elementFactory: elementFactory, layout: new StackLayout(), repeater: ref repeater ); await UpdateLayoutWithWaitAsync(); Verify.AreEqual(numItems, VisualTreeHelper.GetChildrenCount(repeater)); for (int i = 0; i < numItems; i++) { var element = (TextBlock)repeater.TryGetElement(i); Verify.AreEqual(i.ToString(), element.Text); } }); }
public void ValidateReyclingElementFactoryWithNoTemplate() { RunOnUIThread.Execute(() => { var elementFactory = new RecyclingElementFactoryDerived() { RecyclePool = new RecyclePool() }; Verify.Throws <COMException>(delegate { var context = (ElementFactoryGetArgs)RepeaterTestHooks.CreateRepeaterElementFactoryGetArgs(); context.Parent = null; context.Data = 0; elementFactory.GetElement(context); }); }); }
public void ValidateSentinelsDuringInserts() { RunOnUIThread.Execute(() => { var dataSource = new CustomItemsSource(Enumerable.Range(0, 10).ToList()); int getElementCallCount = 0; int recycleElementCallCount = 0; var elementFactory = new RecyclingElementFactoryDerived() { Templates = { { "key", SharedHelpers.GetDataTemplate("<TextBlock Text='{Binding}' Height='100' />") } }, RecyclePool = new RecyclePool(), GetElementFunc = (int index, UIElement owner, UIElement elementFromBase) => { getElementCallCount++; return(elementFromBase); }, ClearElementFunc = (UIElement element, UIElement owner) => recycleElementCallCount++, ValidateElementIndices = false }; var repeater = SetupRepeater(dataSource, elementFactory); getElementCallCount = 0; recycleElementCallCount = 0; Log.Comment("Insert in realized range: Inserting 100 items at index 1"); dataSource.Insert(index: 1, count: 100, reset: false); repeater.UpdateLayout(); var realized = VerifyRealizedRange(repeater, dataSource); Verify.IsGreaterThan(realized, 0); Verify.IsLessThan(getElementCallCount, 6); Verify.IsLessThan(recycleElementCallCount, 6); }); }
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); } }); }