Подтвердить что ты не робот

WPF TreeView: где находится метод ExpandAll()

Как я могу расширить все узлы TreeView в WPF? В WinForms был метод ExpandAll(), который делает это.

4b9b3361

Ответ 1

Класс WPF TreeView не имеет метода ExpandAll. Таким образом, вам придется перебирать узлы и устанавливать для них свойства IsExpanded значение true.

Ответ 2

Это может помочь

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

Ответ 3

с помощью стиля XAML Treeview у вас должен быть такой же набор свойств, как указано выше:             

В Cs файле, напишите такие методы, как в моем примере, я использовал кнопку, а мое имя treeview - 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;
        }
    }

надеюсь, что это может вам помочь.

Ответ 4

В дополнение к комментарию user2779123, и я знаю, что это давно уже было дан ответ, но я также хотел бы предположить, что код Пьера-Оливье Пиньона подталкивает treeItem.IsExpanded = true; не только переносятся в область нулевой проверки, но и перемещая ее в процедуру 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);
    }
}

Ответ 5

Ответ, предоставленный @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);
}

Ответ 6

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

Ответ 7

попробуйте это

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

Ответ 8

Хотя многие ответы уже были предложены во время этой публикации, они либо полагаются на управляющий код позади, либо не позволяют пользователю управлять действием. Ниже приведена стратегия, которая заимствует некоторые другие ответы, но использует шаблон проектирования MVVM, в котором действие расширения расширяется пользователем из пользовательского интерфейса и направляется в модель просмотра.

В файле XAML используется кнопка и передает элемент управления TreeView в качестве параметра CommandParameter (TreeView называется SomethingTreeView).

 <Button Command="{Binding ExpandAllCommand}" CommandParameter="{Binding ElementName=SomethingTreeView}">Expand All</Button>

В файле CS View View используется RelayCommand<TreeView>, чтобы команда могла принимать параметр TreeView. Команда вызывает функцию, выполняющую работу. (GalaSoft.MvvmLight Сторонняя библиотека использовалась для RelayCommand)

private RelayCommand<TreeView> _ExpandAllCommand;

public ICommand ExpandAllCommand
{
  get { return this._ExpandAllCommand?? (this._ExpandAllCommand= new RelayCommand<TreeView>((treeView) => { ExpandAll(treeView); })); }
}

private void ExpandAll(TreeView treeView)
{
  foreach (var treeViewItem in treeView.Items)
  {
    var childItem = treeView.ItemContainerGenerator.ContainerFromItem(treeViewItem) as TreeViewItem;
    childItem.IsExpanded = true;
  }
}