2009-05-07 15 views

答えて

7

WPF TreeViewクラスにはExpandAllメソッドがありません。したがって、ノードをループしてIsExpandedプロパティをtrueに設定する必要があります。

64

これは、あなたが上に書いたものをそのようなプロパティのセッター持っている必要がありますXAMLツリービュースタイルで

<TreeView> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsExpanded" Value="True" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 
+1

シンプルかつ効果的にしてみてください!ありがとう! – StinkyCat

+3

しかし、このソリューションは要求時ではなく読み込み時に実行されます。 – Ahmad

15

を助けるかもしれない:私のサンプルIでは、このようなメソッドを記述し、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; 
     } 
    } 

希望します。

1

user2779123のコメントに加えて、私はこれまで長いこと答えられていますが、Pierre-Olivier PignonのコードがtreeItem.IsExpanded = trueをプッシュすることをお勧めします。 nullチェックの範囲に移動するだけでなく、ツリー構造の展開と折りたたみの両方を可能にする形式で記述されているようにExpandAllプロシージャに移動することで、これにルートノードを追加します機能によって設計されています。

以下の例のように:

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); 
    } 
} 
+0

ItemsControlには.IsExpandedはありませんが、TreeViewItemには含まれています。 – Tomas

0

@ピエール・オリビエが提供する答えは良いものです。

個人的には、データがどれくらい深くネストされているかわからないような状況では、再帰的ではなくスタックを使用することを好みます。さらに良いことに、それは拡張機能として提供することができる。

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); 
} 
-1
/// <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(); 
      } 
     } 
    } 
} 
+0

動作しません... –

-1

すると、この

private void btnExpandAll_Click(object sender, RoutedEventArgs e) 
{ 
    foreach(var item in tvES.Items) 
    { 
     var tvi = item as TreeViewItem; 
     if (tvi != null) 
      tvi.ExpandSubtree(); 
    } 
}