2

我需要以普通列表的形式访问 TreeView 的节点(就像所有展开的节点一样)才能按 Shift 键进行多选。有没有办法做到这一点?

谢谢

4

2 回答 2

8

Here is a method that will retrieve all the TreeViewItems in a TreeView. Please be aware that this is an extremely expensive method to run, as it will have to expand all TreeViewItems nodes and perform an updateLayout each time. As the TreeViewItems are only created when expanding the parent node, there is no other way to do that.

If you only need the list of the nodes that are already opened, you can remove the code that expand them, it will then be much cheaper.

Maybe you should try to find another way to manage multiselection. Having said that, here is the method :

    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;
    }
于 2012-11-14T15:45:08.823 回答
-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);
于 2012-11-14T13:40:33.473 回答