WPF TreeView 中迴圈遍歷查詢要素並快速定位
阿新 • • 發佈:2018-12-08
/// <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); } }