WPFですべてのTreeViewノードを展開するにはどうすればよいですか? WinFormsには、これを行うExpandAll()メソッドがありました。
WPF TreeViewクラスにはExpandAllメソッドがありません。したがって、ノードをループして、IsExpandedプロパティをtrueに設定する必要があります。
これは役立つかもしれません
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
xAML Treeviewスタイルでは、上記のようなプロパティセッターが必要です。
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;
}
}
お役に立てれば幸いです。
これを試して
private void btnExpandAll_Click(object sender, RoutedEventArgs e)
{
foreach(var item in tvES.Items)
{
var tvi = item as TreeViewItem;
if (tvi != null)
tvi.ExpandSubtree();
}
}
@ Pierre-Olivierが提供する答えは良いものです。
個人的には、データがどの程度深くネストされているかが分からないような状況では、再帰よりもスタックを使用することを好みます。さらに良いことに、それは拡張機能として提供することができます:
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);
}
/// <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();
}
}
}
}
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);
}
}