如何在 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 = 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);
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();
}
}
tvi
始终为空,无法折叠。......作为解决方案,可以修改此代码:不要进行强制转换(var tvi = item as TreeViewItem;
),而是像Pierre-Oliver那样进行操作:TreeViewItem tvi = tvES.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
- Beauty@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);
}
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;
}
}
}
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
是您的TreeView的名称)。