WPF TreeView:ExpandAll() 方法在哪里

问题描述 投票:0回答:9

如何展开WPF中的所有TreeView节点?在 WinForms 中,有一个 ExpandAll() 方法可以执行此操作。

wpf treeview
9个回答
105
投票

这可能有帮助

<TreeView>
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="True" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

21
投票

使用 XAML Treeview 样式,您必须有一个像上面所写的属性设置器:

在 Cs 文件中,编写这样的方法,在我的示例中我使用了一个按钮,我的树视图的名称是 myTV :

private void ExpandAll(ItemsControl items, bool expand)
    {
        foreach (object obj in items.Items)
        {
            ItemsControl childControl = items.ItemContainerGenerator.ContainerFromItem(obj) as ItemsControl;
            if (childControl != null)
            {
                ExpandAll(childControl, expand);
            }
            TreeViewItem item = childControl as TreeViewItem;
            if (item != null)
                item.IsExpanded = expand;
        }
    }


    private void btnExpandAll_Click(object sender, RoutedEventArgs e)
    {
        
        foreach (object item in this.myTV.Items)
        {
            TreeViewItem treeItem = this.myTV.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
            if (treeItem != null)
                ExpandAll(treeItem, true);
            treeItem.IsExpanded = true;
        }
    }

希望能帮到你。


14
投票

WPF TreeView 类没有 ExpandAll 方法。因此,您必须循环遍历节点并将其 IsExpanded 属性设置为 true。


7
投票

试试这个

private void btnExpandAll_Click(object sender, RoutedEventArgs e)
{
    foreach(var item in tvES.Items)
    {
        var tvi = item as TreeViewItem;
        if (tvi != null)
            tvi.ExpandSubtree();
    }
}

4
投票

@Pierre-Olivier 提供的答案很好。

就个人而言,在您不知道数据嵌套有多深的情况下,我更喜欢使用堆栈而不是递归。更好的是,它可以作为扩展功能提供:

public static void ExpandAll(this TreeViewItem treeViewItem, bool isExpanded = true)
{
    var stack = new Stack<TreeViewItem>(treeViewItem.Items.Cast<TreeViewItem>());
    while(stack.Count > 0)
    {
        TreeViewItem item = stack.Pop();

        foreach(var child in item.Items)
        {
            var childContainer = child as TreeViewItem;
            if(childContainer == null)
            {
                childContainer = item.ItemContainerGenerator.ContainerFromItem(child) as TreeViewItem;
            }

            stack.Push(childContainer);
        }

        item.IsExpanded = isExpanded;
    }
}

public static void CollapseAll(this TreeViewItem treeViewItem)
{
    treeViewItem.ExpandAll(false);
}

4
投票

现在是 2022 年 1 月 14 日,我正在使用 VS2022 和 .net6。 我相信在2015年至今,MS建立了一个名为ExpandSubTree()的新方法,它不能展开整个树,而是展开单个TreeViewItem。它让事情变得更容易。

CollapseAll 非常不同,因为只有第一层需要折叠。

public static class TreeViewHelper
{
    public static void ExpandAll(this TreeView treeView)
    {
        foreach (var item in treeView.Items)
        {
            if (treeView.ItemContainerGenerator.ContainerFromItem(item) is TreeViewItem treeViewItem)
                treeViewItem.ExpandSubtree();
        }
    }

    public static void CollapseAll(this TreeView treeView)
    {
        foreach (var item in treeView.Items)
        {
            if (treeView.ItemContainerGenerator.ContainerFromItem(item) is TreeViewItem treeViewItem)
                treeViewItem.IsExpanded = false;
        }
    }

    public static void CollapseAll(this TreeViewItem treeViewItem)
    {
        foreach (var item in treeViewItem.Items)
        {
            if (treeViewItem.ItemContainerGenerator.ContainerFromItem(item) is TreeViewItem subTreeViewItem)
                subTreeViewItem.IsExpanded = false;
        }
    }
}

0
投票

除了 user2779123 的评论之外,我知道这个问题早已得到解答,但我还建议 Pierre-Olivier Pignon 的代码推送 treeItem.IsExpanded = true;不仅被移动到空检查的范围内,而且通过将其移动到 ExpandAll 过程,因为它似乎是以允许扩展和折叠树结构的格式编写的,并将其移动到那里会将根节点添加到此设计的功能性。

按照下面的例子:

private void ExpandAll(ItemsControl items, bool expand)
{
    items.IsExpanded = expand;
    foreach (object obj in items.Items)
    {
        ItemsControl childControl = items.ItemContainerGenerator.ContainerFromItem(obj) as ItemsControl;
        if (childControl != null)
        {
            ExpandAll(childControl, expand);
        }
        TreeViewItem item = childControl as TreeViewItem;
        if (item != null)
            item.IsExpanded = true;
    }
}


private void btnExpandAll_Click(object sender, RoutedEventArgs e)
{

    foreach (object item in this.myTV.Items)
    {
        TreeViewItem treeItem = this.myTV.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
        if (treeItem != null)
            ExpandAll(treeItem, true);
    }
}

0
投票
    /// <summary>
    /// Collapse the TreeView.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void _collapseTreeView_button_Click(object sender, RoutedEventArgs e)
    {
        _ordersParentChild_TreeView.UpdateLayout();
        if (_ordersParentChild_TreeView.Items.Count > 0)
        {
            var rootTreeViewItem = _ordersParentChild_TreeView.Items[0] as TreeViewItem;
            if (rootTreeViewItem != null)
            {
                rootTreeViewItem.IsExpanded = false;
            }
        }
    }
    /// <summary>
    /// Expand the TreeView.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void _expandTreeView_button_Click(object sender, RoutedEventArgs e)
    {
        _ordersParentChild_TreeView.UpdateLayout();
        if(_ordersParentChild_TreeView.Items.Count > 0)
        {
            var rootTreeViewItem = _ordersParentChild_TreeView.Items[0] as TreeViewItem;
            if (rootTreeViewItem != null)
            {
                rootTreeViewItem.ExpandSubtree();
            }
        }
    }
}

0
投票

尽管其他解决方案也有效,但有一种更简单的方法可以做到这一点,这几乎是各种响应的混合。

public void ExpandAll(TreeView treeView)
{
    foreach (object item in treeView.Items)
        if (trvStory.ItemContainerGenerator.ContainerFromItem(item) is TreeViewItem treeItem)
            treeItem.ExpandSubtree();
}

现在,您只需创建一个调用它的方法:

private void btnExpandAll_Click(object sender, RoutedEventArgs e)
{
    ExpandAll(trvItems);
}

(其中

trvItems
是树视图的名称)。

© www.soinside.com 2019 - 2024. All rights reserved.