WPF LogicalTree vs Visual Tree

Copy from https://www.c-sharpcorner.com/blogs/wpf-logical-and-visual-trees1

 

 

复制代码
WPF's hierarchical structure requires a new conceptual model of application structure, which takes the form of an element tree. Two types of element trees are required to adequately represent an element structure: a Logical Tree and a Visual Tree.

LOGICAL TREE: The Logical Tree is a tree structure that represents the hierarchy of controls and elements that constitute a piece of user interface in WPF, but without their inner parts. The logical tree is responsible for:

1. Inherit DependencyProperty values
2. Resolving DynamicResources references
3. Looking up element names for bindings
4. Forwaring RoutedEvents

Example:

DockPanel
 +ListBox
   +Button
   +Button
   +Button

VISUAL TREE: The Visual Tree is a tree structure that represents the fine-grained hierarchy of Visuals that constitute what appears on the screen. It contains the same elements as the Logical Tree, but includes all the Visuals that are used to compose the Logical Tree's controls and elements, like the ControlTemplates and DataTemplates. The visual tree is responsible for:

1. Rendering visual elements
2. Propagate element opacity
3. Propagate Layout- and RenderTransforms
4. Propagate the IsEnabled property.
5. Do Hit-Testing
6. RelativeSource 

Example:

DockPanel
    +ListBox
      +Border
        +...
        +VirtualizingStackPanel
          +ListBoxItem
            +Button
              +Border
              +....
复制代码

 

 

 

复制代码
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp283
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            PrintLogicalTree(0, this);
            //var logicalTrees=LogicalTreeHelper.GetChildren(this);
        }

        private void PrintLogicalTree(int depth, object obj)
        {
            Debug.WriteLine($"LogicalTree:{depth}");
            if (!(obj is DependencyObject))
            {
                return;
            }

            foreach (object child in LogicalTreeHelper.GetChildren(obj as DependencyObject))
            {
                PrintLogicalTree(depth+1, child);
            }
        }

        protected override void OnContentRendered(EventArgs e)
        {
            base.OnContentRendered(e);
            PrintVisualTree(0, this);
        }

        void PrintVisualTree(int depth,DependencyObject obj)
        {
            Debug.WriteLine($"Visualtree:{depth}");
            for(int i=0;i<VisualTreeHelper.GetChildrenCount(obj);i++)
            {
                PrintVisualTree(depth+1,VisualTreeHelper.GetChild(obj,i));
            }
        }
    }
}
复制代码

 

posted @   FredGrit  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示