如何将WPF TreeView的所有元素作为List?

Ign*_*cia 2 .net c# wpf treeview

我需要访问TreeView的节点作为普通列表(就好像所有扩展的节点一样),以便能够按Shift键进行多选.有没有办法实现这个目标?

谢谢

Sis*_*phe 6

这是一个将检索TreeView中所有TreeViewItem的方法.请注意,这是一种非常昂贵的运行方法,因为它必须每次都扩展所有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;
    }
Run Code Online (Sandbox Code Playgroud)