programing

WPF 트리 보기:ExpandAll() 메서드는 어디에 있습니까?

telebox 2023. 5. 2. 22:37
반응형

WPF 트리 보기:ExpandAll() 메서드는 어디에 있습니까?

WPF에서 모든 TreeView 노드를 확장하려면 어떻게 해야 합니까?WinForms에는 이를 수행하는 ExpandAll() 메서드가 있었습니다.

이것은 도움이 될 수 있습니다.

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

XAML Treeview 스타일을 사용하려면 위에 쓴 것과 같은 속성 설정자가 있어야 합니다.

Cs 파일에서, 이렇게 쓰는 방법, 내 샘플에서 나는 버튼을 사용했고 나의 트리뷰의 이름은 나입니다.TV:

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

도움이 되길 바랍니다.

WPF TreeView 클래스에는 ExpandAll 메서드가 없습니다.따라서 노드를 순환하고 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);
}

지금은 2022-01-14이고, 저는 VS2022를 .net6과 함께 사용하고 있습니다.2015년부터 지금까지 MS는 전체 트리가 아니라 단일 TreeViewItem을 확장할 수 있는 ExpandSubTree()라는 새로운 방법을 구축했다고 생각합니다.그것은 일을 더 쉽게 만듭니다.

접기첫 번째 계층만 접으면 되기 때문에 모든 것이 다릅니다.

public static class TreeViewHelper
{
    public static void ExpandAll(this TreeView treeView)
    {
        foreach (var item in treeView.Items)
        {
            if (treeView.ItemContainerGenerator.ContainerFromItem(item) is TreeViewItem treeViewItem)
                treeViewItem.ExpandSubtree();
        }
    }

    public static void CollapseAll(this TreeView treeView)
    {
        foreach (var item in treeView.Items)
        {
            if (treeView.ItemContainerGenerator.ContainerFromItem(item) is TreeViewItem treeViewItem)
                treeViewItem.IsExpanded = false;
        }
    }

    public static void CollapseAll(this TreeViewItem treeViewItem)
    {
        foreach (var item in treeViewItem.Items)
        {
            if (treeViewItem.ItemContainerGenerator.ContainerFromItem(item) is TreeViewItem subTreeViewItem)
                subTreeViewItem.IsExpanded = false;
        }
    }
}

사용자 2779123의 의견 외에도 이것이 답변된 지 오래되었다는 것을 알지만 Pierre-Olivier Pignon의 코드가 트리Item을 푸시하는 것을 제안합니다.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);
    }
}
    /// <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();
            }
        }
    }
}

다른 솔루션은 작동하지만, 응답이 거의 혼합된 훨씬 더 간단한 방법이 있습니다.

public void ExpandAll(TreeView treeView)
{
    foreach (object item in treeView.Items)
        if (trvStory.ItemContainerGenerator.ContainerFromItem(item) is TreeViewItem treeItem)
            treeItem.ExpandSubtree();
}

이제 다음과 같은 방법을 만들기만 하면 됩니다.

private void btnExpandAll_Click(object sender, RoutedEventArgs e)
{
    ExpandAll(trvItems);
}

(어디서trvItems트리 뷰의 이름입니다.

언급URL : https://stackoverflow.com/questions/834081/wpf-treeview-where-is-the-expandall-method

반응형