2012-11-14 55 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对象的列表。 –