locked
Как раскрыть все узлы (TreeViewItems) объекта TreeView ? RRS feed

  • Общие обсуждения

  • В отличие от Windows Forms, текущая версия WPF не предоставляет простого пути для раскрытия всех узлов TreeView одной строчкой кода. Есть 2 пути осуществить эту функцию. Первый способ использовать возможности WPF стилей, как в в следующем XAMLPad примере:
    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <Page.Resources>
        <XmlDataProvider x:Key="treeData" XPath="*">
          <x:XData>
            <Items Name="Items" xmlns="">
              <Item1/>
              <Item2>
                <Item22/>
                <Item12/>
                <Item13>
                  <Item131/>
                  <Item131/>
                </Item13>
              </Item2>
            </Items>
          </x:XData>
        </XmlDataProvider>
    
        <HierarchicalDataTemplate ItemsSource="{Binding XPath=child::*}" 
                                 x:Key="template">
          <TextBlock Name="textBlock" Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
      </Page.Resources>
      <TreeView ItemTemplate="{StaticResource template}" 
               ItemsSource="{Binding Source={StaticResource treeData}}">
        <TreeView.ItemContainerStyle>
          <!--Using style setter to set the TreeViewItem.IsExpanded property to true, this will be applied
          to all TreeViweItems when they are generated-->
          <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="True"/>
          </Style>
        </TreeView.ItemContainerStyle>
      </TreeView>
    </Page> 
    
    Иногда вам может понадобиться программный путь решения, и вы можете использовать следующий вспомогательный С# метод, что бы раскрыть все узлы:
    public static class TreeViewHelper 
    { 
        public static void ExpandAll(TreeView treeView) 
        { 
            ExpandSubContainers(treeView); 
        } 
    
        private static void ExpandSubContainers(ItemsControl parentContainer) 
        { 
            foreach (Object item in parentContainer.Items) 
            { 
                TreeViewItem currentContainer = parentContainer.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem; 
                if (currentContainer != null && currentContainer.Items.Count > 0) 
                { 
                    // Expand the current item. 
                    currentContainer.IsExpanded = true; 
                    if (currentContainer.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated) 
                    { 
                        // If the sub containers of current item is not ready, we need to wait until 
                        // they are generated. 
                        currentContainer.ItemContainerGenerator.StatusChanged += delegate 
                        { 
                            ExpandSubContainers(currentContainer); 
                        }; 
                    } 
                    else 
                    { 
                        // If the sub containers of current item is ready, we can directly go to the next 
                        // iteration to expand them. 
                        ExpandSubContainers(currentContainer); 
                    } 
                } 
            } 
        } 
    }
    
    Основной идей способа показанного выше, убедиться что контейнер для текущего TreeViewItem был сгенерирован, и вы можете спокойно раскрыть узел и показать все его элементы. Поэтому вам нужно сделать рекурсивный вызов, когда статус текущего TreeViewItem's ItemContainerGenerator будет GeneratorStatus.ContainersGenerated.
    Для связи [Mail]
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 23:04 MSDN Forums consolidation (От:Разработка Windows-приложений)
    17 марта 2010 г. 11:47
    Модератор