C'è un modo per espandere automaticamente tutti i nodi da una vista ad albero in WPF? Ho cercato e non ho nemmeno trovato una funzione di espansione nella proprietà di treeview.AutoExpand treeview in WPF
Grazie
C'è un modo per espandere automaticamente tutti i nodi da una vista ad albero in WPF? Ho cercato e non ho nemmeno trovato una funzione di espansione nella proprietà di treeview.AutoExpand treeview in WPF
Grazie
È può impostare ItemContainerStyle e utilizzare la proprietà 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>
Se avete bisogno di fare questo dal codice, è possibile scrivere viewmodel per i tuoi articoli visualizzazione ad albero, e si legano proprietà IsExpanded al corrispondente da modello. Per ulteriori esempi si riferiscono a grande articolo da Josh Smith su CodeProject: risposta Simplifying the WPF TreeView by Using the ViewModel Pattern
Questo è quello che io uso:
private void ExpandAllNodes(TreeViewItem rootItem)
{
foreach (object item in rootItem.Items)
{
TreeViewItem treeItem = (TreeViewItem)item;
if (treeItem != null)
{
ExpandAllNodes(treeItem);
treeItem.IsExpanded = true;
}
}
}
Al fine di farlo funzionare è necessario chiamare questo metodo in un ciclo foreach per il nodo principale:
// this loop expands all nodes
foreach (object item in myTreeView.Items)
{
TreeViewItem treeItem = (TreeViewItem)item;
if (treeItem != null)
{
ExpandAllNodes(treeItem);
treeItem.IsExpanded = true;
}
}
Ciao Carlo. Questo non funzionerà se hai qualcosa di diverso da TreeViewItem nella tua raccolta di articoli. Se vuoi essere sicuro che questo approccio funzioni in ogni caso, dovresti usare ItemContainerGenerator dal tuo oggetto TreeView e chiamare il suo metodo ContainerFromItem(). – Anvaka
Hai ragione, il modo in cui aggiungo gli oggetti al mio treeview è myTree.Items.Add (new TreeViewItem() {Header = myObject}) ;, Ecco perché funziona per me. Ci scusiamo per fuorviando. – Carlo
È possibile semplificare il codice in myTreeView.Items.OfType
di Carlo era migliore perché apre tutti i livelli
Questo migliora l'esempio con un piccolo esempio di codice più conciso.
private void ExpandAllNodes(TreeViewItem treeItem)
{
treeItem.IsExpanded = true;
foreach (var childItem in treeItem.Items.OfType<TreeViewItem>())
{
ExpandAllNodes(childItem);
}
}
Chiamatela utilizzando questa riga di codice
TreeViewInstance.Items.OfType<TreeViewItem>().ToList().ForEach(ExpandAllNodes);
se si desidera espandere manualmente si può provare
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;
}
Ho dimenticato di dire che non ho TreeviewItem, ma diversi tipi di elementi nel mio albero. –