1. 程式人生 > >WPF TreeView 中迴圈遍歷查詢要素並快速定位

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);
        }
    }