protected override void RecycleElementCore(ElementFactoryRecycleArgs args) { var element = args.Element; var key = RecyclePool.GetReuseKey(element); m_recyclePool.PutElement(element, key, args.Parent); }
public ViewManager(ItemsRepeater owner) { // ItemsRepeater is not fully constructed yet. Don't interact with it. m_owner = owner; m_resetPool = new UniqueIdElementPool(owner); m_lastFocusedElement = owner; m_phaser = new Phaser(owner); m_ElementFactoryGetArgs = new ElementFactoryGetArgs(); m_ElementFactoryRecycleArgs = new ElementFactoryRecycleArgs(); }
public void ClearElementToElementFactory(UIElement element) { m_owner.OnElementClearing(element); if (m_owner.ItemTemplateShim != null) { if (m_ElementFactoryRecycleArgs == null) { // Create one. m_ElementFactoryRecycleArgs = new ElementFactoryRecycleArgs(); } var context = m_ElementFactoryRecycleArgs; context.Element = element; context.Parent = m_owner; m_owner.ItemTemplateShim.RecycleElement(context); context.Element = null; context.Parent = null; } else { // No ItemTemplate to recycle to, remove the element from the children collection. var children = m_owner.Children; int childIndex = 0; childIndex = children.IndexOf(element); if (childIndex < 0) { throw new InvalidOperationException("ItemsRepeater's child not found in its Children collection."); } children.RemoveAt(childIndex); } var virtInfo = ItemsRepeater.GetVirtualizationInfo(element); virtInfo.MoveOwnershipToElementFactory(); m_phaser.StopPhasing(element, virtInfo); if (m_lastFocusedElement == element) { // Focused element is going away. Remove the tracked last focused element // and pick a reasonable next focus if we can find one within the layout // realized elements. int clearedIndex = virtInfo.Index; MoveFocusFromClearedIndex(clearedIndex); } REPEATER_TRACE_PERF("ElementCleared"); }
private void UnlinkElementFromParent(ElementFactoryRecycleArgs args) { // We want to unlink the containers from the parent repeater // in case we are required to move it to a different repeater. if (args.Parent is Panel panel) { var children = panel.Children; var childIndex = children.IndexOf(args.Element); if (childIndex >= 0) { children.RemoveAt(childIndex); } } }
protected override void RecycleElementCore(ElementFactoryRecycleArgs args) { var element = args.Element; if (element != null) { if (element is NavigationViewItem nvi) { var nviImpl = nvi; // Check whether we wrapped the element in a NavigationViewItem ourselves. // If yes, we are responsible for recycling it. if (nviImpl.CreatedByNavigationViewItemsFactory) { nviImpl.CreatedByNavigationViewItemsFactory = false; UnlinkElementFromParent(args); args.Element = null; // Retain the NVI that we created for future re-use navigationViewItemPool.Add(nvi); // Retrieve the proper element that requires recycling for a user defined item template // and update the args correspondingly if (m_itemTemplateWrapper != null) { // TODO: Retrieve the element and add to the args } } } // Do not recycle SettingsItem bool isSettingsItem = m_settingsItem != null && m_settingsItem == args.Element; if (m_itemTemplateWrapper != null && !isSettingsItem) { m_itemTemplateWrapper.RecycleElement(args); } else { UnlinkElementFromParent(args); } } }
protected override void RecycleElementCore(Microsoft.UI.Xaml.Controls.ElementFactoryRecycleArgs args) { }
protected override void RecycleElementCore(ElementFactoryRecycleArgs args) { }
// Retrieve the element that will be displayed for a specific data item. // If the resolved element is not derived from NavigationViewItemBase, wrap in a NavigationViewItem before returning. protected override UIElement GetElementCore(ElementFactoryGetArgs args) { object GetNewContent(IElementFactoryShim itemTemplateWrapper, NavigationViewItemBase settingsItem) { // Do not template SettingsItem if (settingsItem != null && settingsItem == args.Data) { return(args.Data); } if (itemTemplateWrapper != null) { return(itemTemplateWrapper.GetElement(args)); } return(args.Data); } var newContent = GetNewContent(m_itemTemplateWrapper, m_settingsItem); // Element is already of expected type, just return it if (newContent is NavigationViewItemBase newItem) { return(newItem); } #if !HAS_UNO_WINUI // Accidentally adding a OS XAML NavigationViewItem to WinUI's NavigationView can cause unnecessary confusion for developers // due to unexpected rendering, potentially without an easy way to understand what went wrong here. To help out developers, // we are explicitly checking for this scenario here and throw a helpful error message so that they can quickly fix their app. if (newContent is Windows.UI.Xaml.Controls.NavigationViewItemBase) { throw new InvalidOperationException("A NavigationView instance contains a Windows.UI.Xaml.Controls.NavigationViewItem. This control requires that its NavigationViewItems be of type Microsoft.UI.Xaml.Controls.NavigationViewItem."); } #endif // Get or create a wrapping container for the data NavigationViewItem GetNavigationViewItem() { if (navigationViewItemPool.Count > 0) { var nvi = navigationViewItemPool[navigationViewItemPool.Count - 1]; navigationViewItemPool.RemoveAt(navigationViewItemPool.Count - 1); return(nvi); } return(new NavigationViewItem()); } var nvi = GetNavigationViewItem(); var nviImpl = nvi; nviImpl.CreatedByNavigationViewItemsFactory = true; // If a user provided item template exists, just pass the template and data down to the ContentPresenter of the NavigationViewItem if (m_itemTemplateWrapper != null) { if (m_itemTemplateWrapper is ItemTemplateWrapper itemTemplateWrapper) { // Recycle newContent var tempArgs = new ElementFactoryRecycleArgs(); tempArgs.Element = newContent as UIElement; m_itemTemplateWrapper.RecycleElement(tempArgs); nviImpl.Content = args.Data; nviImpl.ContentTemplate = itemTemplateWrapper.Template; nviImpl.ContentTemplateSelector = itemTemplateWrapper.TemplateSelector; return(nviImpl); } } nviImpl.Content = newContent; return(nviImpl); }
protected virtual void RecycleElementCore(ElementFactoryRecycleArgs args) => throw new NotImplementedException();
public void RecycleElement(ElementFactoryRecycleArgs args) => RecycleElementCore(args);