WPF的树形结构的分析

进化成为路由事件( Routed event),并在其基础上衍生出命令传递机制。这些机制在很大程度上减少了对程序员的束缚,让程序的设计和实现更加灵活,模块之间的耦合度也进一步降低

路由( Route)一词的大意是这样:起点与终点间有若干个中转站,从起点出发后经过每个中

转站时要做出选择,最终以正确(比如最短或者最快)的路径到达终点。编程的本质是用编译器(有时要借助类库)来扩展操作系统的功能,所以,程序的基本运行不可能脱离操作系统— Windows本身就是一种消息驱动的操作系统,所以我们的程序注定都是消息驱动的,程序运行的时候也要把自己的消息系统与整个操作系统的消息系统“连通”才能够被执行和响应。纵观几代 Windows平台程序开发,最早的 Windows apl开发(C语言)和MC开发我们可以直接看到各种消息并可以定义自己的消息;到了COM和ⅤB时代,消息被封装为事件( Event)并一直沿用至NET平台开发——无论怎么说,程序间模块使用消息互相通信的本质是没有改变的。从 Windows api开发到直接消息模型升级为可传递的消息模型——前面我们已经知道WPF的U是由布局组件和控件构成的树形结构,当这棵树上的某个结点激发出某个事件时,程序员可以选择以传统的直接事件模式

让响应者来响应之,也可以让这个事件在UI组件树沿着一定的方向传递且路过多个中转结点,并在这个路由过程中被恰当地处理。你可以把WPF的路由事件看成是一只小蚂蚁,它可以从树的基部向顶部(或反向)目标爬行,每路过一个树枝的分叉点就会把消息带给这个分叉点者交给接收者(或者说事件宿主发生的事件直接由事件响应者的事件处理器来处理)。WPF把这种多数情况下我们是在与 Logical Tree打交道,有时候为了实现一些棘手的功能会向 Visual tree求助,

依个人见解,如果你的程序需要借助
Visual tree来完成一些与业务逻辑(而不是纯表现逻辑)相关的功能,多半是由程序设计不良而造成的,请重新考虑逻辑、功能和数据类型方面的设计

如果想在 Logical Tree上导航或查找元素,可以借助 LogicalTreeHelper类的 static方法来实现:BringInto View:把选定元素带进用户可视区域,经常用于可滚动的视图

FindLogicalNode:按给定名称(Name属性值)查找元素,包括子级树上的元素。

Getchildren:获取所有直接子级元素。

GetParent:获取直接父级元素。

如果想在 Visual tree上导航或査找元素,则可借助Ⅴ /isualTreeHelper类的 static方法来实现。

现在我们已经知道,WPF的U可以表示为 Logical Tree和 Visual Tree,那么当一个路由事件

被激发后是沿着 Logical Tree传递还是沿着 Visual tree传递呢?答案是ⅵ
isual tree—只有这样,“藏”在 Template里的控件才能把消息送出来。

例子:

var rootItem = new
OutlineTreeData

{

outlineTypeName = “David
Weatherbeam”,

Children=

{

new OutlineTreeData

{

outlineTypeName=“Alberto Weatherbeam”,

Children=

{

new OutlineTreeData

{

outlineTypeName=“Zena Hairmonger”,

Children=

{

new
OutlineTreeData

{

outlineTypeName=“Sarah Applifunk”,

}

}

},new
OutlineTreeData

{

outlineTypeName=“Jenny van Machoqueen”,

Children=

{

new
OutlineTreeData

{

outlineTypeName=“Nick van Machoqueen”,

},

new
OutlineTreeData

{

outlineTypeName=“Matilda Porcupinicus”,

},

new
OutlineTreeData

{

outlineTypeName=“Bronco van Machoqueen”,

}

}

}

}

},

new OutlineTreeData

{

outlineTypeName=“Komrade Winkleford”,

Children=

{

new OutlineTreeData

{

outlineTypeName=“Maurice Winkleford”,

Children=

{

new OutlineTreeData

{

outlineTypeName=“Divinity W. Llamafoot”,

}

}

},

new OutlineTreeData

{

outlineTypeName=“Komrade Winkleford, Jr.”,

Children=

{

new
OutlineTreeData

{

outlineTypeName=“Saratoga Z. Crankentoe”,

},

new OutlineTreeData

{

outlineTypeName=“Excaliber Winkleford”,

}

}

}

}

}

}

};

猜你喜欢

转载自blog.csdn.net/weixin_44589117/article/details/90580267