我們在WPF-03 資源之Resources結尾中介紹邏輯樹和可視化樹的基本概念,我們這節來介紹這兩棵樹
邏輯樹(Logical Tree)
邏輯樹是由每個控件的節點組成,本質上就是XAML文件中的UI元素,我們可以通過LogicalTreeHelper類提供的靜態方法獲取邏輯樹的對象,我們通過一個例子演示獲取整個頁面邏輯樹
<Window x:Class="Example_10.RepresentLogicalTree"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Example_10" mc:Ignorable="d" Title="RepresentLogicalTree" Height="450" Width="800"><Grid><Grid.RowDefinitions><RowDefinition Height="0.15*"></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition></Grid.ColumnDefinitions><StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal"><Button Name="btnLogical" Height="30" Click="btnClick_Click">展示邏輯樹</Button><Label VerticalAlignment="Center" Margin="200,0,0,0">Label 控件</Label></StackPanel><StackPanel><TreeView Name="logicalTree"></TreeView></StackPanel></Grid>
</Window>
public partial class RepresentLogicalTree : Window{public RepresentLogicalTree(){InitializeComponent();}private void btnClick_Click(object sender, RoutedEventArgs e){logicalTree.Items.Add(GetLogicTree(this));}public static TreeViewItem GetLogicTree(DependencyObject obj){if (obj == null){return null;}TreeViewItem treeNode = new TreeViewItem { Header = obj.GetType().FullName, IsExpanded = true };foreach (var child in LogicalTreeHelper.GetChildren(obj)){var item = GetLogicTree(child as DependencyObject);if (item != null){treeNode.Items.Add(item);}}return treeNode;}}
我們可以很清晰的看到整個邏輯樹節點對應到XAML頁面中的元素
可視化樹(Visual Tree)
可視化樹是邏輯樹的一種擴展,邏輯樹的每個結點都被分解為核心視覺組件,邏輯樹節點對我們來說是個黑箱,而視覺樹暴露了視覺的實現細節,我們可以通過VisualTreeHelper類提供的靜態方法獲取可視化樹節點,可視化樹要比邏輯樹呈現的粒度更細,XAML結構和上面結構相同,我們來呈現可視化樹結構:
public partial class RepresentVisualTree : Window{public RepresentVisualTree(){InitializeComponent();}private void btnVisual_Click(object sender, RoutedEventArgs e){VisualTree.Items.Add(GetVisualTree(this));}public static TreeViewItem GetVisualTree(DependencyObject obj){if (obj == null){return null;}TreeViewItem?treeNode?=?new?TreeViewItem?{?Header?=?obj.GetType().FullName,?IsExpanded?=?true?};for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++){var child = VisualTreeHelper.GetChild(obj, i);var item = GetVisualTree(child);if (item != null){treeNode.Items.Add(item);}}return treeNode;}}
從上面的例子我們可以看到更細粒度的控件組成部件,下圖展示了整個視覺圖的組成,綠色表示可視化樹,紅色表示邏輯樹,可視化樹范圍包含邏輯樹
這節我們主要了解WPF中邏輯樹和可視化樹,通過本節希望能夠加深對WPF中控件組成的部件的了解