WPF路由事件

2021年09月15日 阅读数:1
这篇文章主要向大家介绍WPF路由事件,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

​    这节讲一下WPF中的路由事件(Routed Event)编程

 

【什么是事件】

    在了解路由事件前,咱们应先来了解一下什么是事件(Event)编辑器

    在Windows系统中,像鼠标单击,双击,移动这样的,都是在触发着一个个事件,事件表明着用户在Windows上的一个动做,至关于用户给系统交代了一个任务让它去执行。本质上事件就是条信息数据,这条数据有对事件的描述,以及携带着事件的参数,这些参数能够看作是事件的“Metadata”,好比你点击鼠标左键,会触发MouseLeftDown和MouseLeftUp这两个事件,它们的参数中就携带了鼠标在屏幕的点击位置(X,Y值)等等信息。布局

    咱们回到编程概念中,在事件这个模型中,咱们要理解如下三个跟事件有关的抽象:学习

  • 事件的拥有者:事件的拥有者就是事件的触发者,好比按钮被点击,那么按钮就是事件的拥有者;spa

  • 事件的响应者:事件的响应者就是事件的处理者,好比咱们在winform后置代码中声明的一个一个事件处理方法,拥有事件处理方法的from体就是事件的响应者;3d

  • 事件订阅关系:要想一个事件被处理,须要让事件的响应者去订阅事件拥有者的事件,在winfrom中这一操做被具象化为在“小闪电”操做栏中对对应的事件关联上后置代码中的事件处理器。orm

    若是说事件的拥有者和响应者是河的两岸,那事件的订阅关系就是链接两岸的桥,让事件的 拥有者经过桥把事件数据交代给事件的响应者,而桥并非惟一的,事件的订阅能够是多个,它是一对n(n>=0)的关系。对象

    固然,上述事件模型也有其弊端:blog

  • 事件的响应者必需要显式订阅事件才能生效事件

  • 事件的拥有者必须能访问到事件的响应者,这样才能创建订阅关系

    因此咱们能了解到,原始的事件模型,对于订阅关系的创建有严格的要求,所以,微软在WPF中推出了路由事件,它使得事件能够再也不以订阅关系创建,下面来了解一下。

 

【路由事件】

  提到路由事件,首先一点,什么是路由呢?这里引入《深刻浅出WPF》一书中对路由的解释:“起点与终点间有若干个中转站,从起点出发后通过每一个中转站时要作出选择,最终以正确(好比最短或者最快)的路径到达终点。” 路由描述的就是这样的一个过程。

     路由事件,是指事件的拥有者和响应者没必要创建订阅关系,拥有者只管激发事件,响应者经过在自身设置事件监听器去监听对应的事件,并能够决定事件是否继续传播,若是说原始事件是两我的窃窃私语的话,那路由事件就是一队人挨个传话。当事件响应者经过事件监听器监听到某个事件的发生,经过事件携带的参数能够获取到事件的来源,从而作出判断该事件是不是本身关心的某个控件激发的,若是是,能够处理并中止事件的传播,若是不是,则放行不予理睬。

    请设想以下图所示的一个XAML控件层级关系:

    蓝色表明Window控件,其内部有两个按钮和一个Grid布局,按钮2在Grid布局中,当按钮1激发单击事件后,该事件的传播路径为:

  按钮1-->Window

    当按钮2激发单击事件后,该事件的传播路径为:

  按钮2-->Grid-->Window

 

 

【如何使用路由事件】

  下面来学习一下如何使用事件监听器监听路由事件,请看以下代码:

    XAML页面结构是名为grid的Grid布局中有个点击按钮。咱们在后置代码中使用AddHandler方法设置事件监听器,该方法的第一个参数是指定监听的路由事件类型对象,第二个参数是指定事件处理器,处理器方法由RoutedEventHandler对象包装,当按钮点击时,在输出窗口中输出了“监听到了btn_click的事件”字样。此处要注意,跟原始事件处理器不一样的是,路由事件处理器的第一个参数sender,是监听事件的控件对象在此处就是grid对象,而咱们要获取是谁激发的事件则是根据第二个参数e的OriginalSource属性。

    当咱们捕获到关心的事件时,控制事件再也不继续传播该怎么作呢,事件处理器的第二个参数e有个Handled属性,该属性是个bool值,设置其为true便可。

    固然,事件监听器也能够从XAML代码中指定:

    经过为ButtonBase(Button的父类)的Click路由事件处理器绑定方法,来实现单击事件的监听。从ButtonBase源代码中能够找到以下图所示的路由事件处理器,该类型跟AddHandler方法的第二个参数类型一致。

 

下一篇: 剖析依赖属性