【问题标题】:How to get all the elements of a WPF TreeView as a List?如何将 WPF TreeView 的所有元素作为列表获取?
【发布时间】:2012-11-14 12:44:40
【问题描述】:

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

谢谢

【问题讨论】:

  • @Klaus78:本文档根本没有讨论 Shift 选择... :(
  • 在文章中,多选是用左 ctrl 键实现的。使用 shift 键为多选调整代码应该不难。
  • 如何填充 TreeView?你在使用 HeirachicalDataTemplate 吗?
  • @Klaus78:控件中的多选行为完全不同,因为您使用 Ctrl 或 Shift。你肯定知道。是的,选择非常不同。

标签: c# .net wpf treeview


【解决方案1】:

这是一个检索 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;
    }

【讨论】:

    【解决方案2】:

    这是你问的;

    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);
    

    【讨论】:

    • 据我所知 treeView.Items 返回树视图的项目(真实内容)而不是树视图项目。如果您使用文件夹填充树视图,则 treeviewItems 返回文件夹对象的列表。
    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2020-11-03
    • 2015-06-03
    相关资源
    最近更新 更多