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)); } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现