天天看點

WPF TreeView自定義可視化樹樣式

目前項目中效果(沒上傳,需要的留言)

WPF TreeView自定義可視化樹樣式

以下例子 最終效果:

TreeView 折疊箭頭,帶垂直方向、水準方向層級線條(如圖)

WPF TreeView自定義可視化樹樣式

來看看怎麼一步步實作吧~

補充一點,代碼本地試過,現剪切的是以可能部分運作顯示與截圖不完全一樣,

但基本結構是沒有問題的,可以自己修改内容試試看!~

先做一個基礎點的樣式(圖左側)

(右側是列印出來節點生成順序,具體輸出含義看本頁的【轉換器】)

WPF TreeView自定義可視化樹樣式

<一>樹結構的建立

寫樹節點的方式有兩種:

【一種是前端xaml直接列出來内容】

【一種是背景綁定】,又分 ①綁定自定義節點類型的資料 或者 ②綁定預設類型資料。

(以下都來試試)

-----------------------------------------------------------------------------------------------------------------------

【一種是前端xaml直接列出來内容】

<TreeView>

       <TreeViewItem/>

       ....

<TreeView x:Name="treeView_Set"  Grid.RowSpan="2" FontSize="18" Margin="10,10,10,10" SelectedItemChanged="TreeView_SelectedItemChanged">

	<TreeViewItem TabIndex="1" Header="{DynamicResource ID_ST_2}">
		<TreeViewItem TabIndex="2" Header="{DynamicResource ID_ST_1}"/>
		<TreeViewItem Header="{DynamicResource ID_ST_2}">
			<TreeViewItem TabIndex="10" Header="{DynamicResource ID_ST_3}"/>
			<TreeViewItem TabIndex="20" Header="{DynamicResource ID_ST_3}"/>
			<TreeViewItem TabIndex="30" Header="{DynamicResource ID_ST_3}"/>
			<TreeViewItem TabIndex="40" Header="{DynamicResource ID_ST_3}">
				<TreeViewItem TabIndex="50" Header="{DynamicResource ID_ST_3}"/>
				<TreeViewItem TabIndex="60" Header="{DynamicResource ID_ST_3}"/>
			</TreeViewItem>
		</TreeViewItem>
		<TreeViewItem TabIndex="70" Header="{DynamicResource ID_ST_3}"/>
		<TreeViewItem TabIndex="80" Header="{DynamicResource ID_ST_3}"/>
		<TreeViewItem TabIndex="90" Header="{DynamicResource ID_ST_3}"/>
	</TreeViewItem>
</TreeView>
           

-----------------------------------------------------------------------------------------------------------------------

【一種是背景綁定】 

①綁定自定義節點類型的資料

xaml前台把綁定元設定上,包括綁定格式等等 : =====>>>> 目前這樣寫,不會使用自定義的itemStyle

<TreeView x:Name="treeView_Set"  Grid.RowSpan="2" FontSize="18" Margin="10,10,10,10" SelectedItemChanged="TreeView_SelectedItemChanged">

                            <TreeView.ItemTemplate>
                                <HierarchicalDataTemplate DataType="{x:Type local:TreeViewItemIPU}" ItemsSource="{Binding Path=Children}">
                                    <TextBlock Text="{Binding TreeViewItemName}" />
                                </HierarchicalDataTemplate>
                            </TreeView.ItemTemplate>

                        </TreeView>
           

後端自定義資料類型,并實作樹結構:

TreeViewItemIPU 綁定對象的定義,與前端綁定的對象類型一緻 (DataType),綁定元Children

再定義對象的屬性,與前端綁定使用到的屬性一緻(TreeViewItemName)

InitDataSource() 實作資料初始化

最後一句 treeView_Set.Items.Add(root); 是将背景生成的樹綁定到前端顯示

/// <summary>
    /// 可視化樹節點的結構定義
    /// </summary>
    public class TreeViewItemIPU
    {
        private string _treeViewItemName;
        public string TreeViewItemName
        {
            get { return _treeViewItemName; }
            set { _treeViewItemName = value; }
        }
        private List<TreeViewItemIPU> _children = new List<TreeViewItemIPU>();
        public List<TreeViewItemIPU> Children
        {
            get
            {
                return _children;
            }
            set
            {
                if (value != _children)
                {
                    _children = value;
                }
            }
        }

    }

        /// <summary>
        /// 樹形結構内容加載(初始化時調用即可)
        /// </summary>
        private void InitDataSource()
        {
            TreeViewItemIPU root = new TreeViewItemIPU() { TreeViewItemName = "Root" };
            TreeViewItemIPU childLevel1 = new TreeViewItemIPU() { TreeViewItemName = "childLevel1" };


            TreeViewItemIPU childLevel1_1 = new TreeViewItemIPU() { TreeViewItemName = "childLevel1_1" };
            TreeViewItemIPU childLevel1_1_1 = new TreeViewItemIPU() { TreeViewItemName = "childLevel1_1_1" };
            TreeViewItemIPU childLevel1_1_1_1 = new TreeViewItemIPU() { TreeViewItemName = "childLevel1_1_1_1" };
            TreeViewItemIPU childLevel1_1_1_2 = new TreeViewItemIPU() { TreeViewItemName = "childLevel1_1_1_2" };
            TreeViewItemIPU childLevel1_1_1_3 = new TreeViewItemIPU() { TreeViewItemName = "childLevel1_1_1_3" };
            TreeViewItemIPU childLevel1_1_1_4 = new TreeViewItemIPU() { TreeViewItemName = "childLevel1_1_1_4" };
            childLevel1_1_1.Children.Add(childLevel1_1_1_1);
            childLevel1_1_1.Children.Add(childLevel1_1_1_2);
            childLevel1_1_1.Children.Add(childLevel1_1_1_3);
            childLevel1_1_1.Children.Add(childLevel1_1_1_4);
            childLevel1_1.Children.Add(childLevel1_1_1);

            TreeViewItemIPU childLevel1_2 = new TreeViewItemIPU() { TreeViewItemName = "childLevel1_2" };
            TreeViewItemIPU childLevel1_2_1 = new TreeViewItemIPU() { TreeViewItemName = "childLevel1_2_1" };
            TreeViewItemIPU childLevel1_2_2 = new TreeViewItemIPU() { TreeViewItemName = "childLevel1_2_2" };
            childLevel1_2.Children.Add(childLevel1_2_1);
            childLevel1_2.Children.Add(childLevel1_2_2);

            childLevel1.Children.Add(childLevel1_1);
            childLevel1.Children.Add(childLevel1_2);

            TreeViewItemIPU childLevel2 = new TreeViewItemIPU() { TreeViewItemName = "childLevel2" };
            TreeViewItemIPU childLevel2_1 = new TreeViewItemIPU() { TreeViewItemName = "childLevel2_1" };
            TreeViewItemIPU childLevel2_2 = new TreeViewItemIPU() { TreeViewItemName = "childLevel2_2" };
            TreeViewItemIPU childLevel2_3 = new TreeViewItemIPU() { TreeViewItemName = "childLevel2_3" };
            TreeViewItemIPU childLevel2_4 = new TreeViewItemIPU() { TreeViewItemName = "childLevel2_4" };
            childLevel2.Children.Add(childLevel2_1);
            childLevel2.Children.Add(childLevel2_2);
            childLevel2.Children.Add(childLevel2_3);
            childLevel2.Children.Add(childLevel2_4);

            root.Children.Add(childLevel1);
            root.Children.Add(childLevel2);

            treeView_Set.Items.Add(root);
        }
           

-----------------------------------------------------------------------------------------------------------------------

【一種是背景綁定】

②綁定預設類型資料

InitDataSource() 實作樹結構初始化

最後一句 treeView_Set.Items.Add(root); 是将背景生成的樹綁定到前端顯示

private void InitDataSource()
        {
            TreeViewItem root = new TreeViewItem() { TabIndex = 1, Header = "Root" };
            TreeViewItem childLevel1 = new TreeViewItem() { TabIndex = 2, Header = "childLevel1" };

            TreeViewItem childLevel1_1 = new TreeViewItem() { TabIndex = 3, Header = "childLevel1_1" };
            TreeViewItem childLevel1_1_1 = new TreeViewItem() { TabIndex = 4, Header = "childLevel1_1_1" };
            TreeViewItem childLevel1_1_1_1 = new TreeViewItem() { TabIndex = 5, Header = "childLevel1_1_1_1" };
            TreeViewItem childLevel1_1_1_2 = new TreeViewItem() { TabIndex = 6, Header = "childLevel1_1_1_2" };
            TreeViewItem childLevel1_1_1_3 = new TreeViewItem() { TabIndex = 7, Header = "childLevel1_1_1_3" };
            TreeViewItem childLevel1_1_1_4 = new TreeViewItem() { TabIndex = 8, Header = "childLevel1_1_1_4" };
            childLevel1_1_1.Items.Add(childLevel1_1_1_1);
            childLevel1_1_1.Items.Add(childLevel1_1_1_2);
            childLevel1_1_1.Items.Add(childLevel1_1_1_3);
            childLevel1_1_1.Items.Add(childLevel1_1_1_4);
            childLevel1_1.Items.Add(childLevel1_1_1);

            TreeViewItem childLevel1_2 = new TreeViewItem() { TabIndex = 9, Header = "childLevel1_2" };
            TreeViewItem childLevel1_2_1 = new TreeViewItem() { TabIndex = 10, Header = "childLevel1_2_1" };
            TreeViewItem childLevel1_2_2 = new TreeViewItem() { TabIndex = 11, Header = "childLevel1_2_2" };
            childLevel1_2.Items.Add(childLevel1_2_1);
            childLevel1_2.Items.Add(childLevel1_2_2);

            childLevel1.Items.Add(childLevel1_1);
            childLevel1.Items.Add(childLevel1_2);

            TreeViewItem childLevel2 = new TreeViewItem() { TabIndex = 12, Header = "childLevel2" };
            TreeViewItem childLevel2_1 = new TreeViewItem() { TabIndex = 13, Header = "childLevel2_1" };
            TreeViewItem childLevel2_2 = new TreeViewItem() { TabIndex = 14, Header = "childLevel2_2" };
            TreeViewItem childLevel2_3 = new TreeViewItem() { TabIndex = 15, Header = "childLevel2_3" };
            TreeViewItem childLevel2_4 = new TreeViewItem() { TabIndex = 16, Header = "childLevel2_4" };
            childLevel2.Items.Add(childLevel2_1);
            childLevel2.Items.Add(childLevel2_2);
            childLevel2.Items.Add(childLevel2_3);
            childLevel2.Items.Add(childLevel2_4);

            root.Items.Add(childLevel1);
            root.Items.Add(childLevel2);

            treeView_Set.Items.Add(root);

        }
           

-----------------------------------------------------------------------------------------------------------------------

<二>樹的樣式模闆

!!!有一點疑問:

我嘗試将定義的 <TreeViewItem> 樣式直接設定到 <TreeView> 的子節點屬性中,但是不知道怎麼設定;

考慮每個 item 都設定 style屬性有點繁雜,是以就沒給 <TreeViewItem> 定義 x:key,運用到範圍内所有TreeViewItem控件

==> >>>   這點如果有誰知道怎麼辦,麻煩告訴我下~

【App.xaml】  樹TreeView樣式,含自定義:

①樹折疊展開的ToggleButton樣式(ExpandCollapseToggleStyle)

②樹孩子節點的樣式TreeViewItem

展開會顯示一層節點垂直方向線,和每個節點水準方向線

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:system="clr-namespace:System;assembly=mscorlib"

                    xmlns:vc="clr-namespace:ui.DataConverter">



 <!-- 可視化樹折疊展開的按鈕樣式 -->
    <Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
        <Setter Property="Focusable" Value="False"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <Grid Width="15" Height="13" SnapsToDevicePixels="True">
                        <!-- Rectangle 9x9 pixels -->
                        <Rectangle Width="9" Height="9" Stroke="#919191" SnapsToDevicePixels="true">
                            <Rectangle.Fill>
                                <LinearGradientBrush EndPoint="0.5,2" StartPoint="0.5,0">
                                    <GradientStop Color="White" Offset="0"/>
                                    <GradientStop Color="Silver" Offset="0.5"/>
                                    <GradientStop Color="LightGray" Offset="1"/>
                                </LinearGradientBrush>
                            </Rectangle.Fill>
                        </Rectangle>
                        <!-- 畫一個垂直方向的直線 -->
                        <Rectangle x:Name="ExpandPath" Width="1" Height="5" Stroke="Black" SnapsToDevicePixels="true"/>
                        <!-- 畫一個水準方向的直線 -->
                        <Rectangle Width="5" Height="1" Stroke="Black" SnapsToDevicePixels="true"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <!-- 通過IsChecked判斷折疊還是展開 -->
                        <Trigger Property="IsChecked" Value="True">
                            <Setter Property="Visibility" TargetName="ExpandPath" Value="Collapsed"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


    <vc:TreeViewLineConverter x:Key="LineConverter"/>
    <!-- (通用)可視化樹孩子樣式 -->
    <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"></Setter>
        <!--<Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>-->
        <!--<Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>-->
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Padding" Value="2"/>
        <Setter Property="Foreground" Value="#FF565656"/>
        <Setter Property="FontFamily" Value="FZLTZHUNHK"/>
        <Setter Property="FontSize" Value="18"/>
        <Setter Property="BorderThickness" Value="0"/>
        <!--<Setter Property="FocusVisualStyle" Value="{StaticResource TreeViewItemFocusVisual}"/>-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TreeViewItem}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition MinWidth="19" Width="Auto"/>
                            <ColumnDefinition MinWidth="20" Width="Auto"/>
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" MinHeight="20"/>
                            <RowDefinition  />
                        </Grid.RowDefinitions>
                        <!-- Connecting Lines -->
                        <!-- Horizontal line -->
                        <Rectangle x:Name="HorLn" Margin="9,0,0,0" Height="1" Stroke="#FF565656" SnapsToDevicePixels="True" StrokeDashCap="Square" StrokeDashArray="3,5" StrokeDashOffset="1"/>
                        <!-- Vertical line -->
                        <Rectangle x:Name="VerLn" Width="1" Stroke="#FF565656" Margin="0,0,1,0" Grid.RowSpan="2" SnapsToDevicePixels="true" Fill="White" StrokeDashCap="Square" StrokeDashArray="3,5"/>


                        <ToggleButton x:Name="Expander" 
                                      Grid.Column="0" 
                                      Grid.Row="0"  
                                      ClickMode="Press"
                                      IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
                                      Style="{StaticResource ExpandCollapseToggleStyle}"/>
                        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" 
                                BorderThickness="{TemplateBinding BorderThickness}" 
                                Background="{TemplateBinding Background}" 
                                CornerRadius="4"
                                HorizontalAlignment="Left"
                                Grid.Column="1"
                                Margin="1"
                                Padding="{TemplateBinding Padding}" 
                                SnapsToDevicePixels="true">
                            <ContentPresenter x:Name="PART_Header" 
                                              ContentSource="Header" 
                                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </Border>
                        <ItemsPresenter x:Name="ItemsHost" 
                                        Grid.ColumnSpan="2" 
                                        Grid.Column="1" 
                                        Grid.Row="1" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsExpanded" Value="false">
                            <Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/>
                        </Trigger>
                        <Trigger Property="HasItems" Value="false">
                            <Setter Property="Visibility" TargetName="Expander" Value="Hidden"/>
                        </Trigger>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Background" TargetName="Bd" Value="#FF025BC7"/>
                            <Setter Property="Foreground" Value="#FFFFFFFF"/>
                        </Trigger>
                       <!--被選中後失去焦點-->
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" TargetName="Bd" Value="#FF025BC7"/>
                            <Setter Property="Foreground" Value="#FFFFFFFF"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                        <!-- 目前層最後一個元素不畫下方垂直線 -->
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource LineConverter}}" Value="true">
                            <Setter TargetName="VerLn" Property="Height" Value="15"/>
                            <Setter TargetName="VerLn" Property="VerticalAlignment" Value="Top"/>
                        </DataTrigger>
                        <!-- Root第一個元素不顯示上方垂直線 -->
                        <Trigger Property="TabIndex" Value="1">
                            <Setter TargetName="VerLn" Property="Margin" Value="0,12,1,0"/>
                            <Setter TargetName="VerLn" Property="Height" Value="Auto"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="VirtualizingStackPanel.IsVirtualizing" Value="true">
                <Setter Property="ItemsPanel">
                    <Setter.Value>
                        <ItemsPanelTemplate>
                            <VirtualizingStackPanel/>
                        </ItemsPanelTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>

    </Style>
           

【轉換器】

對于目前層最後一個節點,不再畫它水準方向線以下的垂直線,這裡使用到轉換器完成

依賴這個轉換器,我試了下檢視每個節點生成的順序 

==>>>   System.Console.WriteLine(..)  列印出來生成順序見【基本圖】的右側

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Data;


namespace ui.DataConverter
{
    /// <summary>
    /// 判斷是否是構造目前層的最後一個元素
    /// </summary>
    class TreeViewLineConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            TreeViewItem item = (TreeViewItem)value;
            ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(item);
            //System.Console.WriteLine(ic.Items.Count + "  " + item.Header.ToString());
            return ic.ItemContainerGenerator.IndexFromContainer(item) == ic.Items.Count - 1;
        }


        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return false;
        }
    }
}
           

--------------------------------------------------------------------------------------------------------------------------

【再來,更新下按鈕樣式 ==> 最終效果圖】

<!-- 可視化樹折疊展開的按鈕樣式 -->
    <Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
        <Setter Property="Focusable" Value="False"/>
        <Setter Property="Background" Value="White"/>
        <Setter Property="BorderBrush" Value="#FF565656"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <Grid>
                        <!-- 畫折疊樣式 -->
                        <Border x:Name="CollapsePath" Height="14" Width="10" SnapsToDevicePixels="True" Background="{TemplateBinding Background}">
                            <!--<Rectangle x:Name="CollapsePath" Width="1" Height="5" Stroke="{TemplateBinding Background}" SnapsToDevicePixels="true"/>-->
                            <Path Data="M 0,0 8,7 0,14" Stretch="Fill"
                                  Stroke="{TemplateBinding BorderBrush}" StrokeThickness="1.5"
                                  Height="14" Width="8"
                                  VerticalAlignment="Center" 
                                  HorizontalAlignment="Center"
                                  Margin="0,0,0,0">
                                <Path.LayoutTransform>
                                    <TransformGroup>
                                        <ScaleTransform/>
                                        <SkewTransform/>
                                        <RotateTransform Angle="0"/>
                                        <TranslateTransform/>
                                    </TransformGroup>
                                </Path.LayoutTransform>
                            </Path>
                        </Border>
                        <!-- 畫展開折疊樣式 -->
                        <Border x:Name="ExpandPath" Height="10" Width="14" SnapsToDevicePixels="True" Background="{TemplateBinding Background}" Visibility="Collapsed">
                            <!--<Rectangle x:Name="ExpandPath" Width="1" Height="5" Stroke="{TemplateBinding Background}" SnapsToDevicePixels="true"/>-->
                            <Path Data="M 0,0 8,7 0,14" Stretch="Fill"
                                  Stroke="{TemplateBinding BorderBrush}" StrokeThickness="1.5"
                                  Height="14" Width="8"
                                  VerticalAlignment="Center" 
                                  HorizontalAlignment="Center"
                                  Margin="0,0,0,0">
                                <Path.LayoutTransform>
                                    <TransformGroup>
                                        <ScaleTransform/>
                                        <SkewTransform/>
                                        <RotateTransform Angle="90"/>
                                        <TranslateTransform/>
                                    </TransformGroup>
                                </Path.LayoutTransform>
                            </Path>
                        </Border>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <!-- 通過IsChecked判斷折疊還是展開 -->
                        <Trigger Property="IsChecked" Value="True">
                            <Setter Property="Visibility" TargetName="CollapsePath" Value="Collapsed"/>
                            <Setter Property="Visibility" TargetName="ExpandPath" Value="Visible"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

    </Style>
           

【其他設定,我暫時沒有用上】

<!-- 每個item文本的外觀 -->

<!--<Style TargetType="HeaderedContentControl">

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type HeaderedContentControl}">
                    <StackPanel>
                        <Grid>
                            <Rectangle Stroke="{TemplateBinding Background}"/>
                            <ContentPresenter ContentSource="Header"/>
                        </Grid>
                        <Grid>
                            <Rectangle Fill="{TemplateBinding Background}"/>
                            <ContentPresenter ContentSource="Content"/>
                        </Grid>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>-->


    <!-- 捕獲鍵盤時的外觀 -->

    <!-- 鍵盤上下移動,左右控制展開折疊 -->
    <!--<Style x:Key="TreeViewItemFocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>-->
           

!!!有一點疑問:

我嘗試将定義的 <TreeViewItem> 樣式直接設定到 <TreeView> 的子節點屬性中,但是不知道怎麼設定;

考慮每個 item 都設定 style屬性有點繁雜,是以就沒給 <TreeViewItem> 定義 x:key,運用到範圍内所有TreeViewItem控件

==> >>>   這點如果有誰知道怎麼辦,麻煩告訴我下~

繼續閱讀