WPF TreeView:ExpandAll() 方法在哪里
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/834081/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
WPF TreeView: Where is the ExpandAll() method
提问by Prabu Arumugam
How can I expand all TreeView nodes in WPF? In WinForms there was a ExpandAll() method which does this.
如何在 WPF 中展开所有 TreeView 节点?在 WinForms 中有一个 ExpandAll() 方法可以做到这一点。
采纳答案by CSharper
The WPF TreeView class does not have an ExpandAll method. Thus you'd have to loop through the nodes and set their IsExpanded properties to true.
WPF TreeView 类没有 ExpandAll 方法。因此,您必须遍历节点并将其 IsExpanded 属性设置为 true。
回答by Prabu Arumugam
This might help
这可能有帮助
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
回答by Pierre-Olivier Pignon
with XAML Treeview style you must have a property setter like that what wrote above :
使用 XAML Treeview 样式,你必须有一个像上面写的那样的属性设置器:
In Cs file, write methods like this, in my sample i used a button and my treeview's name is myTV :
在 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;
}
}
hope it could help you.
希望它可以帮助你。
回答by Artem
try this
尝试这个
private void btnExpandAll_Click(object sender, RoutedEventArgs e)
{
foreach(var item in tvES.Items)
{
var tvi = item as TreeViewItem;
if (tvi != null)
tvi.ExpandSubtree();
}
}
回答by InTheZone
The answer provided by @Pierre-Olivier is a good one.
@Pierre-Olivier 提供的答案很好。
Personally, I prefer to use a stack rather than recursion in circumstances such as these where you have no idea how deeply nested the data could be. Even better, it could be provided as an extension function:
就个人而言,在您不知道数据嵌套有多深的情况下,我更喜欢使用堆栈而不是递归。更好的是,它可以作为扩展功能提供:
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);
}
回答by Stephen Oberski
/// <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();
}
}
}
}
回答by Peter Ferguson
In addition to user2779123's comment and I know this is long since been answered but I would also suggest that Pierre-Olivier Pignon's code push the treeItem.IsExpanded = true; not only be moved into scope of the null check but by moving it to the ExpandAll procedure as it appears to be written in a format that allows for both expansion and collapsing of the tree structure and moving this to there would add the root nodes to this functionality by design.
除了 user2779123 的评论,我知道这早就有人回答了,但我也建议 Pierre-Olivier Pignon 的代码推送 treeItem.IsExpanded = true; 不仅被移入空检查的范围,而且通过将它移到 ExpandAll 过程,因为它似乎是以允许扩展和折叠树结构的格式编写的,并将其移到那里会将根节点添加到此功能设计。
As per the below example:
根据以下示例:
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);
}
}