WPF中自动展开树形视图

53

有没有一种方法可以自动展开WPF树形视图中的所有节点?我搜索了,甚至在treeview属性中也没有找到展开函数。

谢谢


1
忘了提到我没有TreeViewItem,而是在我的树中有不同种类的项。 - David Brunelle
5个回答

87
你可以设置ItemContainerStyle并使用IsExpanded属性。
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <Grid>
      <TreeView>
         <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
               <Setter Property="IsExpanded" Value="True"/>
            </Style>
         </TreeView.ItemContainerStyle>
         <TreeViewItem Header="Header 1">
            <TreeViewItem Header="Sub Item 1"/>
         </TreeViewItem>
         <TreeViewItem Header="Header 2">
            <TreeViewItem Header="Sub Item 2"/>
         </TreeViewItem>
      </TreeView>
   </Grid>
</Page>

如果您需要从代码中执行此操作,则可以为树视图项编写视图模型,并将IsExpanded属性绑定到模型中相应的属性。有关更多示例,请参阅Josh Smith在CodeProject上的优秀文章:“通过使用视图模式简化WPF TreeView”


我在MVVM绑定视图中使用了这种方法,它完美地工作了。 - Roddles

5

这是我使用的:

private void ExpandAllNodes(TreeViewItem rootItem)
{
    foreach (object item in rootItem.Items)
    {
        TreeViewItem treeItem = (TreeViewItem)item;

        if (treeItem != null)
        {
            ExpandAllNodes(treeItem);
            treeItem.IsExpanded = true;
        }
    }
}

为了使其正常工作,您必须在根节点的foreach循环中调用此方法:
// this loop expands all nodes
foreach (object item in myTreeView.Items)
{
    TreeViewItem treeItem = (TreeViewItem)item;

    if (treeItem != null)
    {
        ExpandAllNodes(treeItem);
        treeItem.IsExpanded = true;
    }
}

3
嗨,Carlo。如果您的Items集合中有与TreeViewItem不同的内容,则此方法将无效。如果您想确保此方法在任何情况下都有效,则应该使用TreeView对象的ItemContainerGenerator并调用其ContainerFromItem()方法。 - Anvaka
你是对的,我向我的树形视图添加项目的方式是 myTree.Items.Add(new TreeViewItem() { Header = myObject });,这就是为什么它对我有效。抱歉误导了你。 - Carlo
1
您可以将代码简化为myTreeView.Items.OfType<TreeViewItem>(),这样您就不必检查null或case项了。 - jwize

5

如果您想手动扩展,可以尝试以下方法:

XAML:

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

c#:

bool Expanded = false; 
// The event subscription method (for a button click)
private void ButtonExpand__Click(object sender, RoutedEventArgs e)
{
    Expanded = !Expanded;
    Style Style = new Style
    {
        TargetType = typeof(TreeViewItem)
    };

    Style.Setters.Add(new Setter(TreeViewItem.IsExpandedProperty, Expanded));
    TreePeople.ItemContainerStyle = Style;
}

2

Carlo的答案更好,因为它打开了所有级别。

这比那个示例更好,代码更加简洁明了。

    private void ExpandAllNodes(TreeViewItem treeItem)
    {
        treeItem.IsExpanded = true;  
        foreach (var childItem in treeItem.Items.OfType<TreeViewItem>())
        {
                ExpandAllNodes(childItem);
        }
    }

使用以下代码调用它

TreeViewInstance.Items.OfType<TreeViewItem>().ToList().ForEach(ExpandAllNodes);

foreach (TreeViewItem childItem in TreeItem.Items) 比你的 foreach 更短,但同样有效 :) - Shakaron
1
这在使用 MVVM 时将无法工作,因为项不会是 TreeViewItem。请参阅 Anvaka 在 Carlo 回答中的评论。 - user585968

0

另一种通过编程方式操作树形项的完全展开,可能是通过C#代码,使用TreeViewItem.ExpandSubTree()命令在根节点上。

private void ExpandFirstRootNode()
{
   TreeViewControl.Items[0].ExpandSubtree();
}

这样做不会只扩展一个“Items”子树吗? 我们不应该全部执行吗? - Derek Pollard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接