web-dev-qa-db-ja.com

WPFのAutoExpandツリービュー

WPFのツリービューからすべてのノードを自動的に展開する方法はありますか?私は検索しましたが、treeviewプロパティに展開関数が見つかりませんでした。

ありがとう

45
David Brunelle

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に関するJosh Smithのすばらしい記事を参照してください。 ViewModelパターンを使用してWPF TreeViewを簡略化する

69
Anvaka

これは私が使用するものです:

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

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

これを機能させるには、ルートノードのforeachループでこのメソッドを呼び出す必要があります。

// 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

手動で展開したい場合は、試すことができます

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

すべてのレベルが開かれるため、Carloの回答の方が優れていました

これは、もう少し簡潔なコード例でその例を改善します。

    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);
2
jwize

おそらくc#コードを介してツリー項目の完全な展開を操作する別のプログラムによる方法は、ルートノードでTreeViewItem.ExpandSubTree()コマンドを使用することです。

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