如何展开WPF中的所有TreeView节点?在 WinForms 中,有一个 ExpandAll() 方法可以执行此操作。
这可能有帮助
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
使用 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;
}
}
希望能帮到你。
WPF TreeView 类没有 ExpandAll 方法。因此,您必须循环遍历节点并将其 IsExpanded 属性设置为 true。
试试这个
private void btnExpandAll_Click(object sender, RoutedEventArgs e)
{
foreach(var item in tvES.Items)
{
var tvi = item as TreeViewItem;
if (tvi != null)
tvi.ExpandSubtree();
}
}
@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);
}
现在是 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;
}
}
}
除了 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);
}
}
/// <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();
}
}
}
}
尽管其他解决方案也有效,但有一种更简单的方法可以做到这一点,这几乎是各种响应的混合。
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
是树视图的名称)。