Есть ли способ автоматически развернуть все узлы из дерева в WPF? Я искал и даже не нашел функцию расширения в свойстве treeview.AutoExpand treeview в WPF
Благодаря
Есть ли способ автоматически развернуть все узлы из дерева в WPF? Я искал и даже не нашел функцию расширения в свойстве treeview.AutoExpand treeview в WPF
Благодаря
You может установить 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>
Если вам нужно сделать это из кода, вы можете написать ViewModel для просмотра дерева элементов, и привязать IsExpanded свойство к соответствующему одному из модели. Дополнительные примеры относятся к большой статье от Джоша Смита CodeProject: ответ Simplifying the WPF TreeView by Using the ViewModel Pattern
Это то, что я использую:
private void ExpandAllNodes(TreeViewItem rootItem)
{
foreach (object item in rootItem.Items)
{
TreeViewItem treeItem = (TreeViewItem)item;
if (treeItem != null)
{
ExpandAllNodes(treeItem);
treeItem.IsExpanded = true;
}
}
}
Для того, чтобы работать вы должны вызвать этот метод в цикле Еогеасп для корневого узла:
// this loop expands all nodes
foreach (object item in myTreeView.Items)
{
TreeViewItem treeItem = (TreeViewItem)item;
if (treeItem != null)
{
ExpandAllNodes(treeItem);
treeItem.IsExpanded = true;
}
}
Привет Карло. Это не сработает, если у вас есть что-то отличное от TreeViewItem в вашей коллекции Items. Если вы хотите убедиться, что этот подход работает в любом случае, вы должны использовать ItemContainerGenerator из объекта TreeView и вызвать его метод ContainerFromItem(). – Anvaka
Вы правы, так как я добавляю элементы в свое дерево, это myTree.Items.Add (новый TreeViewItem() {Header = myObject}); Вот почему он работает для меня. Извините за ввод в заблуждение. – Carlo
Вы можете упростить код, который будет myTreeView.Items.OfType
Карло было лучше, потому что он открывает все уровни
Это улучшает этот пример с небольшим количеством более кратким примере кода.
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);
если вы хотите расширить вручную, вы можете попробовать
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;
}
Забытый упоминание У меня нет TreeviewItem, но разные предметы в моем дереве. –