WPF如何展开所有TreeView树节点?
通常TreeView中的TreeViewItem有两种生成方式:
1. 直接在xaml中使用TreeViewItem标签(使用C#代码可干同样的事情,总之是显式使用TreeViewItem)
2. 数据绑定,比如绑定到xml,或数组等。
第一种情况解决办法: 
为TreeView添加ExpandAll()方法。
 public static class ExtensionMethods
public static class ExtensionMethods {
    { public static void ExpandAll(this System.Windows.Controls.TreeView treeView)
        public static void ExpandAll(this System.Windows.Controls.TreeView treeView) {
        { ExpandAllItems(treeView);
            ExpandAllItems(treeView); }
        }
 private static void ExpandAllItems(ItemsControl control)
        private static void ExpandAllItems(ItemsControl control) {
        { if (control == null)
            if (control == null) {
            { return;
                return; }
            }
 foreach (Object item in control.Items)
            foreach (Object item in control.Items) {
            { System.Windows.Controls.TreeViewItem treeItem = control.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
                System.Windows.Controls.TreeViewItem treeItem = control.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
 if (treeItem == null || !treeItem.HasItems)
                if (treeItem == null || !treeItem.HasItems) {
                { continue;
                    continue; }
                }
 treeItem.IsExpanded = true;
                treeItem.IsExpanded = true; ExpandAllItems(treeItem as ItemsControl);
                ExpandAllItems(treeItem as ItemsControl); }
            } }
        } }
    }注意红色行,这样做可适应item不为TreeViewItem的情况。
 然后在Window.ContentRendered事件处理方法中添加如下类似的方法:
 void MainWindow_ContentRendered(object sender, EventArgs e)
void MainWindow_ContentRendered(object sender, EventArgs e) {
{ this.treeView.ExpandAll();
    this.treeView.ExpandAll(); }
}
第二种情况解决办法: 
首先结合第一种情况的办法,然后在xaml代码中添加如下代码:
 <Window.Resources>
<Window.Resources> <Style TargetType="TreeViewItem">
    <Style TargetType="TreeViewItem"> <Setter Property="IsExpanded"
        <Setter Property="IsExpanded"  Value="{Binding IsExpanded,
                Value="{Binding IsExpanded,  Mode=OneWay,
                        Mode=OneWay,  RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeViewItem}}}" />
                        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeViewItem}}}" /> </Style>
    </Style> </Window.Resources>
</Window.Resources>这样就能解决由于数据绑定致使:
1.TreeView中的items不为TreeViewItem
2.使用 ItemContainerGenerator.ContainerFromItem(item)只能在TreeView本身第一级产生作用,更深层的调用时ItemContainerGenerator._status为NotStarted.
 
                    
                     
                    
                 
                    
                
 
 
    
 
         
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号