WPF TreeView: где находится метод ExpandAll () - PullRequest
36 голосов
/ 07 мая 2009

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

Ответы [ 7 ]

74 голосов
/ 05 августа 2011

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

<TreeView>
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="True" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>
17 голосов
/ 11 марта 2013

со стилем 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;
        }
    }

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

12 голосов
/ 07 мая 2009

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

4 голосов
/ 15 апреля 2017

попробуйте

private void btnExpandAll_Click(object sender, RoutedEventArgs e)
{
    foreach(var item in tvES.Items)
    {
        var tvi = item as TreeViewItem;
        if (tvi != null)
            tvi.ExpandSubtree();
    }
}
2 голосов
/ 24 мая 2016

Ответ, предоставленный @ 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);
}
0 голосов
/ 08 ноября 2016
    /// <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 голосов
/ 06 ноября 2015

В дополнение к комментарию 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...