Wpf的UI是由布局组件和控件构成的树形结构,完全由布局组件和控件构成

事件——路由事件

事件——路由事件

2018/1/3 16:32:35


事件路由允许源自有些成分的风云由另三个要素引发。
wpf把一向音信模型升级为可传递的音讯模型。Wpf的UI是由布局组件和控件构成的树形结构,激发事件时,程序员能够采取以观念的直接事件方式让响应者来响应,也足以让这么些事件在UI组件树沿着一定方向传递且经过八个换车节点,且被稳当处理。

2018/1/3 16:32:35


事件路由允许源自某些成分的风浪由另3个要素引发。
wpf把直接音讯模型升级为可传递的新闻模型。Wpf的UI是由布局组件和控件构成的树形结构,激发事件时,程序员能够挑选以观念的第壹手事件形式让响应者来响应,也足以让那么些事件在UI组件树沿着一定方向传递且经过多少个换车节点,且被妥帖处理。

逻辑树(Logical Tree)与可视成分树(Visual Tree)

逻辑树(Logical Tree)与可视成分树(Visual Tree)

逻辑树

一心由布局组件和控件构成,即大家见到的代码

逻辑树

全盘由布局组件和控件构成,即我们看到的代码

可视成分树

把逻辑树延伸至Template组件级别。即看看布局依然控件的细节。能够运用Blend,它能够解剖观看二个空中的沙盘(Template)。
这两棵树在“财富”的时候也会提及。

可视成分树

把逻辑树延伸至Template组件级别。即看看布局依旧控件的细节。能够动用Blend,它能够解剖观看贰个空间的模版(Template)。
那两棵树在“财富”的时候也会提及。

事件

事件其实是2个选用event关键字修饰的委托(Delegate)类型成员变量,事件处理器(伊夫nt
Handler)则是3个函数,A订阅了B的事件,便是说,让B.伊芙nt与A.伊夫ntHandler关联起来。所谓事件激发,正是B.伊芙nt被调用,那时,与其涉及的A.伊芙ntHandler就会被调用。
信托:是1个足以引用方法的靶子,当创立贰个委托,也就创制了二个引用方法的目的,进而能够调用那些格局。即委托可以调用它所指的法门。

事件

事件实际是一个用到event关键字修饰的寄托(Delegate)类型成员变量,事件处理器(伊夫nt
Handler)则是贰个函数,A订阅了B的风云,正是说,让B.伊夫nt与A.伊芙ntHandler关联起来。所谓事件激发,就是B.伊夫nt被调用,那时,与其涉嫌的A.伊夫ntHandler就会被调用。
寄托:是3个能够引用方法的对象,当创制二个信托,也就创办了一个引用方法的靶子,进而能够调用那个形式。即委托能够调用它所指的办法。

直接事件模型(CLCR-V事件模型)

不完美之处:事件的响应者与事件的拥有者之间必须建立事件订阅那么些“专线”联系。(必须树立显示的点对点的订阅关系,事件的宿主必须能够直接待上访问事件的响应者。
会遭遇难题:
次第运营期在容器中动态生成一组相同控件,每一种控件的一致事件都是用同一个事变处理器来响应。
用户控件的里边事件不能够被外界所订阅。当模块划分不粗大的时候,UI组建的吃分外机会很多,假诺想让外层的容器订阅深层控件的某部事件,就必要为每一层组件定义用于暴光内部事件的事件。

直接事件模型(CLENCORE事件模型)

不周密之处:事件的响应者与事件的拥有者之间必须树立事件订阅那些“专线”联系。(必须建立显示的点对点的订阅关系,事件的宿主必须能够直接待上访问事件的响应者。
会赶上难题:
程序运营期在容器中动态生成一组相同控件,各个控件的平等事件都以用同二个轩然大波处理器来响应。
用户控件的个中事件无法被外面所订阅。当模块划分不粗大的时候,UI组建的吃那多少个机会很多,即使想让外层的器皿订阅深层控件的某部事件,就须求为每一层组件定义用于揭发内部事件的风浪。

路由事件(Routed Event)

路由事件的风云拥有者和响应者之间从未一贯展示的订阅关系。拥有者只担负激发事件,响应者则有事件的侦听器(针对某类事件侦听),借使不带有此类事件,则一而再传递给上一级,看看有没有其一事件的侦听。
路由事件是静态字段。

路由事件(Routed Event)

路由事件的事件拥有者和响应者之间从未直接呈现的订阅关系。拥有者只负责激发事件,响应者则有事件的侦听器(针对某类事件侦听),假如不包罗此类事件,则继续传递给上一流,看看有没有其一事件的侦听。
路由事件是静态字段。

wpf内置路由事件

例如:

 <Grid x:Name="grudRoot" Background="Lime" Button.Click="ButtonClick">
    <Button x:Name="Btn" Background="AliceBlue".../>  <!--此处没有bttonclick事件,向上级寻找,找到了就调用-->
    ...
</Grid>
wpf内置路由事件

例如:

 <Grid x:Name="grudRoot" Background="Lime" Button.Click="ButtonClick">
    <Button x:Name="Btn" Background="AliceBlue".../>  <!--此处没有bttonclick事件,向上级寻找,找到了就调用-->
    ...
</Grid>
路由事件常用的处理模型

冒泡事件:由子控件位次向父容器传递,超越50%的路由事件都以冒泡事件
隧道事件:由父容器位次向其子容器、控件传递,一般PreXXX事件性质隧道事件

采取路由事件响应措施中的e.Handled =
true;意味着此事件已经被处理,将不再传递,暗中同意e.Handled的值为false,意味着此路由事件还未处理完整,事件将依照其模型继续向下处理(即执行其余的事件处理方法)

路由事件常用的处理模型

冒泡事件:由子控件位次向父容器传递,大多数的路由事件都以冒泡事件
隧道事件:由父容器位次向其子容器、控件传递,一般PreXXX事件性质隧道事件

动用路由事件响应措施中的e.Handled =
true;意味着此事件早已被拍卖,将不再传递,暗中同意e.Handled的值为false,意味着此路由事件还未处理完整,事件将基于其模型继续向下拍卖(即进行别的的事件处理方法)