WPF TreeView虚拟化选择节点显示

 public void FocusTreeViewNode(EntTreeModel node)
        {
            if (node == null)
                return;

            var treeViewItem = GetTreeViewItem(MemTree, node);
            treeViewItem?.BringIntoView();
        }


        public static TreeViewItem GetTreeViewItem(ItemsControl container, object item)
        {
            if (container == null)
                throw new ArgumentNullException(nameof(container));

            if (item == null)
                throw new ArgumentNullException(nameof(item));

            if (container.DataContext == item)
                return container as TreeViewItem;

            if (container is TreeViewItem && !((TreeViewItem)container).IsExpanded)
            {
                container.SetValue(TreeViewItem.IsExpandedProperty, true);
            }

            container.ApplyTemplate();
            if (container.Template.FindName("ItemsHost", container) is ItemsPresenter itemsPresenter)
            {
                itemsPresenter.ApplyTemplate();
            }
            else
            {
                itemsPresenter = FindVisualChild<ItemsPresenter>(container);
                if (itemsPresenter == null)
                {
                    container.UpdateLayout();
                    itemsPresenter = FindVisualChild<ItemsPresenter>(container);
                }
            }

            var itemsHostPanel = (Panel)VisualTreeHelper.GetChild(itemsPresenter, 0);
            var children = itemsHostPanel.Children;
            var virtualizingPanel = itemsHostPanel as VirtualizingPanel;
            for (int i = 0, count = container.Items.Count; i < count; i++)
            {
                TreeViewItem subContainer;
                if (virtualizingPanel != null)
                {
                    // this is the part that requires .NET 4.5+
                    virtualizingPanel.BringIndexIntoViewPublic(i);
                    subContainer = (TreeViewItem)container.ItemContainerGenerator.ContainerFromIndex(i);
                }
                else
                {
                    subContainer = (TreeViewItem)container.ItemContainerGenerator.ContainerFromIndex(i);
                    subContainer.BringIntoView();
                }

                if (subContainer != null)
                {
                    TreeViewItem resultContainer = GetTreeViewItem(subContainer, item);
                    if (resultContainer != null)
                        return resultContainer;

                    subContainer.IsExpanded = false;
                }
            }
            return null;
        }

        private static T FindVisualChild<T>(Visual visual) where T : Visual
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
            {
                if (VisualTreeHelper.GetChild(visual, i) is Visual child)
                {
                    if (child is T item)
                        return item;

                    item = FindVisualChild<T>(child);
                    if (item != null)
                        return item;
                }
            }
            return null;
        }

猜你喜欢

转载自www.cnblogs.com/robertyao/p/12759884.html