Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将WPF树视图的所有元素作为列表获取?_C#_.net_Wpf_Treeview - Fatal编程技术网

C# 如何将WPF树视图的所有元素作为列表获取?

C# 如何将WPF树视图的所有元素作为列表获取?,c#,.net,wpf,treeview,C#,.net,Wpf,Treeview,我需要以普通列表的形式访问TreeView的节点(就像展开的所有节点一样),以便能够按Shift键进行多重选择。有没有办法做到这一点 谢谢这是你问的问题 private static TreeViewItem[] getTreeViewItems(TreeView treeView) { List<TreeViewItem> returnItems = new List<TreeViewItem>(); for (int x = 0; x < tre

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


谢谢

这是你问的问题

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

下面是一个方法,它将检索TreeView中的所有TreeView项。请注意,这是一个非常昂贵的运行方法,因为它必须扩展所有TreeViewItems节点并每次执行updateLayout。由于TreeViewItem仅在扩展父节点时创建,因此没有其他方法可以做到这一点

如果您只需要已经打开的节点列表,您可以删除扩展它们的代码,这样会便宜得多

也许你应该尝试另一种方法来管理选举。话虽如此,方法如下:

    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;
    }
公共静态列表FindTreeViewItems(this Visual@this)
{
如果(@this==null)
返回null;
var result=新列表();
var frameworkElement=@此为frameworkElement;
if(frameworkElement!=null)
{
frameworkElement.ApplyTemplate();
}
可视子对象=空;
for(inti=0,count=visualtreeheloper.GetChildrenCount(@this);i
关于@Klaus78的情况如何:本文档根本没有讨论轮班选择…:(在这篇文章中,multiselect是用左ctrl键实现的。用shift键调整multiselect的代码应该不难。你是如何填充树视图的?你使用的是HierachicalDataTemplate吗?@Klaus78:控件中multiselect的行为完全不同于使用ctrl键或shift键。你肯定知道这一点。是的,选择是非常不同的。据我所知,treeView。Items返回treeView的项目(真正的内容)而不是treeView项。如果使用对象文件夹填充treeView,则treeView项返回文件夹对象列表。
    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;
    }