2012-11-14 96 views
2

我需要以普通列表的形式訪問TreeView的節點(就像所有擴展的節點一樣),以便能夠按住Shift鍵進行多選。有沒有辦法做到這一點?如何獲取WPF TreeView的所有元素作爲列表?

謝謝

+0

約http://www.codeproject.com/Articles/24585/WPF-MultiSelect-TreeView-Sample – Klaus78

+0

@ Klaus78什麼:本文檔不談論換檔選擇所有...... :( –

+1

在這篇文章中multiselect是用左Ctrl鍵實現的,它不應該很難通過shift鍵來調整多選的代碼 – Klaus78

回答

5

這裏是一個方法,將檢索TreeView中的所有TreeViewItems。請注意,這是一個非常昂貴的運行方法,因爲它將不得不擴展所有TreeViewItems節點並每次執行updateLayout。由於TreeViewItems僅在擴展父節點時創建,因此沒有其他方法可以這樣做。

如果您只需要已經打開的節點列表,您可以刪除擴展它們的代碼,那麼它便宜得多。

也許你應該嘗試找到另一種方式來管理多選。話雖如此,這裏是方法:

public static List<TreeViewItem> FindTreeViewItems(this Visual @this) 
    { 
     if (@this == null) 
      return null; 

     var result = new List<TreeViewItem>(); 

     var frameworkElement = @this as FrameworkElement; 
     if (frameworkElement != null) 
     { 
      frameworkElement.ApplyTemplate(); 
     } 

     Visual child = null; 
     for (int i = 0, count = VisualTreeHelper.GetChildrenCount(@this); i < count; i++) 
     { 
      child = VisualTreeHelper.GetChild(@this, i) as Visual; 

      var treeViewItem = child as TreeViewItem; 
      if (treeViewItem != null) 
      { 
       result.Add(treeViewItem); 
       if (!treeViewItem.IsExpanded) 
       { 
        treeViewItem.IsExpanded = true; 
        treeViewItem.UpdateLayout(); 
       } 
      } 
      foreach (var childTreeViewItem in FindTreeViewItems(child)) 
      { 
       result.Add(childTreeViewItem); 
      } 
     } 
     return result; 
    } 
-3

這是你問的;

private static TreeViewItem[] getTreeViewItems(TreeView treeView) 
{ 
    List<TreeViewItem> returnItems = new List<TreeViewItem>(); 
    for (int x = 0; x < treeView.Items.Count; x++) 
    { 
     returnItems.AddRange(getTreeViewItems((TreeViewItem)treeView.Items[x])); 
    } 
    return returnItems.ToArray(); 
} 
private static TreeViewItem[] getTreeViewItems(TreeViewItem currentTreeViewItem) 
{ 
    List<TreeViewItem> returnItems = new List<TreeViewItem>(); 
    returnItems.Add(currentTreeViewItem); 
    for (int x = 0; x < currentTreeViewItem.Items.Count; x++) 
    { 
     returnItems.AddRange(getTreeViewItems((TreeViewItem)currentTreeViewItem.Items[x])); 
    } 
    return returnItems.ToArray(); 
} 

以您的控件作爲第一個參數調用例如:

getTreeViewItems(treeView1); 
+1

據我所知,treeView.Items返回treeview(真實內容)的項目而不是treeviewitems。如果使用對象文件夾填充樹視圖,則treeviewItems將返回Folder對象的列表。 –