WPF逻辑树与可视树

开发工具与关键技术:Visual Studio 2015

作者:王成

撰写时间:2019年5月3日

 

主页面:1界面左边显示逻辑树,右边显示可视树,代码如下:

<Grid>

<DockPanel>

<Button DockPanel.Dock="Top" Click="Button_Click" Content="获取逻辑树和可视树"></Button>

<Grid>

<Grid.ColumnDefinitions>

<ColumnDefinition/>

<ColumnDefinition/>

</Grid.ColumnDefinitions>

<DockPanel Grid.Column="0">

<TextBlock DockPanel.Dock="Top" Text="逻辑树"></TextBlock>

< Name="tvLogicTree"></TreeView>

</DockPanel>

<DockPanel Grid.Column="1">

<TextBlock DockPanel.Dock="Top" Text="可视树"></TextBlock>

<TreeView Name="tvVisualTree"></TreeView>

</DockPanel>

</Grid>

</DockPanel>

</Grid>

页面: WPF逻辑树与可视树

2、添加类,用于遍历整个XAML界面的逻辑树和可视树:

public class WpfTreeHelper

    {

        static string GetTypeDescription(object obj)

        {

            return obj.GetType().FullName;

        }

        获取逻辑树

        public static TreeViewItem GetLogicTree(DependencyObject obj)

        {

            if (obj == null)

            {

                return null;

            }

            创建逻辑树的节点

            TreeViewItem treeItem = new TreeViewItem { Header = GetTypeDescription(obj), IsExpanded = true };

            循环遍历,获取逻辑树的所有子节点

            foreach (var child in LogicalTreeHelper.GetChildren(obj))

            {

                //递归调用

                var item = GetLogicTree(child as DependencyObject);

                if (item != null)

                {

                    treeItem.Items.Add(item);

                }

            }

            return treeItem;

        }

        获取可视树

        public static TreeViewItem GetVisualTree(DependencyObject obj)

        {

            if (obj == null)

            {

                return null;

            }

            TreeViewItem treeItem = new TreeViewItem { Header = GetTypeDescription(obj), IsExpanded = true };

            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)

            {

                var child = VisualTreeHelper.GetChild(obj, i);

                var item = GetVisualTree(child);

                if (item != null)

                {

                    treeItem.Items.Add(item);

                }

            }

            return treeItem;

        }

    }

 

3、点击按钮获取逻辑树与可视树:

private void Button_Click(object sender, RoutedEventArgs e)

{

this.tvLogicTree.Items.Add(WpfTreeHelper.GetLogicTree(this));

this.tvVisualTree.Items.Add(WpfTreeHelper.GetVisualTree(this));

}

结果图:WPF逻辑树与可视树