WPF TreeView 中循环遍历查询要素并快速定位

 /// <summary>
        /// 获取当前节点下符合条件的子元素
        /// </summary>
        /// <param name="container">当前节点</param>
        /// <param name="item">要查询的元素</param>
        /// <returns></returns>
        private TreeViewItem GetTreeViewItem(ItemsControl container, object item)
        {
            if (container != null)
            {
                //此处是筛选条件 可根据实际情况修改
                if (container.DataContext == item)
                {
                    container.Focus();
                    ((TreeViewItem)container).IsSelected = true;
                    return container as TreeViewItem;
                }
                //Console.WriteLine(((VideoDeviceModel)container.DataContext).Name);
                // 展开当前树节点
                if (container is TreeViewItem && !((TreeViewItem)container).IsExpanded)
                {
                    container.SetValue(TreeViewItem.IsExpandedProperty, true);
                }

                //尝试生成ItemsPresenter和ItemsPanel。
                // 通过调用ApplyTemplate。 请注意,在虚拟化情况下,即使项目已标记
                // 扩展后我们仍然需要这样做去 
                // 重新生成视觉效果,因为它们可能已被虚拟化。

                container.ApplyTemplate();
                ItemsPresenter itemsPresenter =
                    (ItemsPresenter)container.Template.FindName("ItemsHost", container);
                if (itemsPresenter != null)
                {
                    itemsPresenter.ApplyTemplate();
                }
                else
                {
                    // Tree模板尚未命名ItemsPresenter, 
                    // 执行descendents找到子元素.
                    itemsPresenter = FindVisualChild<ItemsPresenter>(container);
                    if (itemsPresenter == null)
                    {
                        container.UpdateLayout();

                        itemsPresenter = FindVisualChild<ItemsPresenter>(container);
                    }
                }

                Panel itemsHostPanel = (Panel)VisualTreeHelper.GetChild(itemsPresenter, 0);


                // 确保已创建此面板的生成器。
                UIElementCollection children = itemsHostPanel.Children;

                MyVirtualizingStackPanel virtualizingPanel =
                    itemsHostPanel as MyVirtualizingStackPanel;

                for (int i = 0, count = container.Items.Count; i < count; i++)
                {
                    TreeViewItem subContainer;
                    if (virtualizingPanel != null)
                    {
                        // 将项目置于视图中 
                        // 将生成容器。
                        virtualizingPanel.BringIntoView(i);

                        subContainer =
                            (TreeViewItem)container.ItemContainerGenerator.
                            ContainerFromIndex(i);
                    }
                    else
                    {
                        subContainer =
                            (TreeViewItem)container.ItemContainerGenerator.
                            ContainerFromIndex(i);

                        // Bring the item into view to maintain the 
                        // same behavior as with a virtualizing panel.
                        subContainer.BringIntoView();
                    }

                    if (subContainer != null)
                    {
                        // Search the next level for the object.
                        TreeViewItem resultContainer = GetTreeViewItem(subContainer, item);
                        if (resultContainer != null)
                        {
                            return resultContainer;
                        }
                        else
                        {
                            // 元素不在TreeViewItem中
                            // 折叠它
                            subContainer.IsExpanded = false;
                        }
                    }
                }
            }

            return null;
        }


        /// <summary>
        /// 在可视化树中搜索特定类型的元素。
        /// </summary>
        /// <typeparam name="T">元素类型</typeparam>
        /// <param name="visual">父元素.</param>
        /// <returns></returns>
        private T FindVisualChild<T>(Visual visual) where T : Visual
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
            {
                Visual child = (Visual)VisualTreeHelper.GetChild(visual, i);
                if (child != null)
                {
                    T correctlyTyped = child as T;
                    if (correctlyTyped != null)
                    {
                        return correctlyTyped;
                    }

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

            return null;
        }
    /// <summary>
    /// 自定义VirtualizingStackPanelBr 用于获取树节点的所有子元素信息(此类随便放到程序能调用的地 
    ///方就行)
    /// </summary>

    public class MyVirtualizingStackPanel : VirtualizingStackPanel
    {
        /// <summary>
        /// Publically expose BringIndexIntoView.
        /// </summary>
        public void BringIntoView(int index)
        {

            this.BringIndexIntoView(index);
        }
    }

猜你喜欢

转载自blog.csdn.net/Yuanben_wuxin/article/details/84892024
今日推荐