web-dev-qa-db-fra.com

Arborescence AutoExpand dans WPF

Existe-t-il un moyen d'étendre automatiquement tous les nœuds à partir d'une arborescence dans WPF? J'ai cherché et je n'ai même pas trouvé de fonction d'extension dans la propriété treeview.

Merci

45
David Brunelle

Vous pouvez définir ItemContainerStyle et utiliser la propriété 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>

Si vous devez le faire à partir du code, vous pouvez écrire le modèle de vue pour vos éléments d'arborescence et lier la propriété IsExpanded à celle correspondante du modèle. Pour plus d'exemples, reportez-vous à un excellent article de Josh Smith sur CodeProject: Simplification de l'arborescence WPF en utilisant le modèle ViewModel

69
Anvaka

Voici ce que j'utilise:

private void ExpandAllNodes(TreeViewItem rootItem)
{
    foreach (object item in rootItem.Items)
    {
        TreeViewItem treeItem = (TreeViewItem)item;

        if (treeItem != null)
        {
            ExpandAllNodes(treeItem);
            treeItem.IsExpanded = true;
        }
    }
}

Pour que cela fonctionne, vous devez appeler cette méthode dans une boucle foreach pour le nœud racine:

// this loop expands all nodes
foreach (object item in myTreeView.Items)
{
    TreeViewItem treeItem = (TreeViewItem)item;

    if (treeItem != null)
    {
        ExpandAllNodes(treeItem);
        treeItem.IsExpanded = true;
    }
}
5
Carlo

si vous voulez développer manuellement vous pouvez essayer

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;
}

La réponse de Carlo était meilleure car elle ouvre tous les niveaux

Cela améliore cet exemple avec un exemple de code un peu plus concis.

    private void ExpandAllNodes(TreeViewItem treeItem)
    {
        treeItem.IsExpanded = true;  
        foreach (var childItem in treeItem.Items.OfType<TreeViewItem>())
        {
                ExpandAllNodes(childItem);
        }
    }

Appelez-le en utilisant cette ligne de code

TreeViewInstance.Items.OfType<TreeViewItem>().ToList().ForEach(ExpandAllNodes);
2
jwize

Une autre façon, par programmation, de manipuler l'expansion complète des éléments de l'arborescence, peut-être via le code c #, consiste à utiliser la commande TreeViewItem.ExpandSubTree() sur un nœud racine.

private void ExpandFirstRootNode()
{
   TreeViewControl.Items[0].ExpandSubtree();
}
0
gmmarcilli