相关文章推荐
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Loaded="Window_Loaded_1">
        <Button Content="button" Margin="179,131,206,150"></Button>
    </Grid>
</Window>

后台cs代码:
        private void Window_Loaded_1(object sender, RoutedEventArgs e)
            StringBuilder tree = new StringBuilder();
            PrintVisualTree(this, 0, tree);
            Console.WriteLine("VisualTree:");
            Console.WriteLine(tree.ToString());
            tree.Clear();
            PrintLogicalTree(this, 0, tree);
            Console.WriteLine("LogicalTree:");
            Console.WriteLine(tree.ToString());
        public void PrintVisualTree(DependencyObject obj, int level, StringBuilder tree)
            tree.AppendLine(new string(' ', level) + obj);
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
                PrintVisualTree(VisualTreeHelper.GetChild(obj, i), level + 1, tree);
        public void PrintLogicalTree(DependencyObject obj, int level, StringBuilder tree)
            tree.AppendLine(new string(' ', level) + obj);
            foreach (var v in LogicalTreeHelper.GetChildren(obj))
                if (v is DependencyObject)
                    PrintLogicalTree(v as DependencyObject, level + 1, tree);
VisualTree:
WpfApplication1.MainWindow
 System.Windows.Controls.Border
  System.Windows.Documents.AdornerDecorator
   System.Windows.Controls.ContentPresenter
    System.Windows.Controls.Grid
     System.Windows.Controls.Button: button
      Microsoft.Windows.Themes.ButtonChrome
       System.Windows.Controls.ContentPresenter
        System.Windows.Controls.TextBlock
   System.Windows.Documents.AdornerLayer
LogicalTree:
WpfApplication1.MainWindow
 System.Windows.Controls.Grid
  System.Windows.Controls.Button: button

从视觉树的结构中可以看到,Button的Content是显示在TextBlock上的,所以,我们可以通过查找视觉树来修改Button的Content样式。

        private void buttonSunny_Click_1(object sender, RoutedEventArgs e)
            ChangeVisualTree<TextBlock>(this);
        public void ChangeVisualTree<T>(DependencyObject obj) where T : FrameworkElement
            if (obj is T)
                switch (typeof(T).Name)
                    case "TextBlock":
                        TextBlock textBlock = obj as TextBlock;
                        textBlock.Background = Brushes.Yellow;
                        textBlock.Foreground = Brushes.Brown;
                        break;
                    default:
                        break;
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
                ChangeVisualTree<T>(VisualTreeHelper.GetChild(obj, i));
WPF Inspector可以更加详细地了解WPF应用的树形结构和样式等,也可以修改样式,用法很简单,先运行WPF应用,然后打开WPF Inspector,等其加载完成之后,双击列表中的应用即可。 
1.1WPF中的坐标
1.1.1 WPF的默认坐标:WPF中平面坐标系主要包括原点位置、X和Y轴方向,以及坐标单位WPF的默认坐标系原点位置在绘制区域的左上角,X轴向右增加,Y轴向下增加。
    自定义坐标系:自定义坐标系主要通过Transform类来实现,一般可以使用ScaleTransform和Translat...
                                    在WPF(Windows Presentation Foundation)中,逻辑Logical Tree)和视觉Visual Tree)是构建和管理用户界面的两个核心概念。- 在WPF中,逻辑视觉共同工作,确保用户界面既能正确表示业务逻辑,又能以合适的方式呈现给用户。- 属性值的继承和资源查找也是通过逻辑进行的,但它们的最终表现是在视觉中实现的。- 视觉的渲染效果(如样式和布局更改)可以反映逻辑中的结构。- 逻辑中的更改(如添加或移除控件)会影响视觉的构成。
                                    WPF中有两中“”:一种叫逻辑Logical Tree);一种叫可视化元素Visual Tree)。
    Logical Tree 最显著的特点就是它完全由布局组件和控件构成(包括列表类控件中的条目元素),换句话说就是它的每个节点不是布局组件就是控件。那什么是 Visual Tree 呢?我们知道,如果把一片叶放在放大镜下观察,你会发现这片叶子也像一棵一样——有自己的基部并向上生长出多级分叉。
    在WPFLogical Tree 上,充当叶子的...
理解WPF中的视觉逻辑
理解WPF中的视觉逻辑  Understanding the Visual Tree and Logical Tree in WPF这篇文章讨论WPF视觉逻辑的细微差别。同时提供了一个小程序供读者稍后分析。如果你已经对着两个概念完全不熟悉,我建议你先读SDK文档中的这篇文章“URL”。
目前SDK文档中关于视觉逻辑的介绍...
提供用于查询逻辑中的对象的静态帮助器方法。
LogicalTreeHelper对于分析方案非常有用,在这种情况下,将以递归方式遍历逻辑,并使用一致的方法检查各种父对象或子对象
Logi..
                                    理解WPF中的视觉逻辑  Understanding the Visual Tree and Logical Tree in WPF
这篇文章讨论WPF视觉逻辑的细微差别。同时提供了一个小程序供读者稍后分析。如果你已经对着两个概念完全不熟悉,
我建议你先读SDK文档中的这篇文章“URL”。
目前SDK文档中关于视觉逻辑的介绍还不是很完全。从我一开始接触WP
                                    逻辑视觉属于WPF的基本概念,学过WPF或者Silverlight的朋友一定会对其有所耳闻,这篇文章将来探讨逻辑视觉的特质以及两者的区别
WPF Inspector工具介绍
WPF Inspector是一个新的WPF辅助工具,我们可以通过这个工具来观察WPF程序生成的逻辑视觉
观察逻辑视觉
左侧为视觉,右侧为逻辑
1、WPF启动程序的根元素均为Application。2、逻辑与XAML的布局结构是相同的。3、视觉是根据控件的模板来呈现的,我们很难猜测视觉的结
                                    #region 获取控件
        //获取当前TreeView的TreeViewItem
        public TreeViewItem GetParentObjectEx<TreeViewItem>(DependencyObject obj) where TreeViewItem : FrameworkElement
            DependencyObject parent = VisualTreeHelper.GetParent(obj);
                                    TreeList
TreeList的职责是读取一棵的根节点,然后把整棵(下称“数据”)转换成一个列表,通过Items属性提供给DataGrid。并且TreeList要负责跟踪数据的节点的增删情况,实时维护Items集合,以便数据的变化能在DataGrid上反映出来。
TreeList独立完成这项工作比较困难,原因在于:每个数据上的节点(下称“数据节点”)显示到表格中时,表格需要知道节点的一些信息,例如
节点在的第几层,以便计算缩进量,节点当前是展开的还是没有展开,节点在表格中是可见还是不可见.
 
推荐文章