微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > .NET技术 > C#.NET >

WinRT/Metro:解析元素的Visual Tree和Logical Tree

时间:2017-01-04 03:46  浏览:努力统计中...
严格上讲,Visual Tree和Logical Tree是WPF的概念,不过既然都有XAML,那么它们在WinRT中也是存在的。 首先WinRT中没有WPF中的Visual,UIElement是直接继承自DependencyObject的,然后下面是FrameworkEle

严格上讲,Visual Tree和Logical Tree是WPF的概念,不过既然都有XAML,那么它们在WinRT中也是存在的。

 

首先WinRT中没有WPF中的Visual,UIElement是直接继承自DependencyObject的,然后下面是FrameworkElement。

image

 

接下来就是使用Windows.Ui.Xaml命名空间下的VisualTreeHelper类型,使用起来和WPF类似,比如根据当前元素查找上面的Visual Tree,代码:

IEnumerable<DependencyObject> GetVisualTree(DependencyObject obj)

{

    var list = new List<DependencyObject>() { obj };

    var res = obj;

    while ((res = VisualTreeHelper.GetParent(res)) != null)

        list.Add(res);

    return list.AsEnumerable().Reverse();

}

 

比如我们在界面上放置一个ListBox(名称是lbx),使用上述自己输出自己的Visual Tree:

lbx.ItemsSource = GetVisualTree(lbx).Select(d => d.GetType().Name);

 

结果:

image

 

 

好了,接着看Logical Tree,不过WinRT目前还没有LogicalTreeHelper类型,不过我们可以通过FrameworkElement.Parent属性来获取对象的Logical Parent。

 

事实上WPF中的LogicalTreeHelper就是这样工作的,只不过同时支持FrameworkElement和FrameworkContentElement,如下WPF中LogicalTreeHelper.GetParent方法源码:

//WPF LogicalTreeHelper.GetParent

public static DependencyObject GetParent(DependencyObject current)

{

    if (current == null)

    {

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线------