写在前面
上一篇文章我写的是WPF中新的属性系统,这篇文章我们讲解一下WPF中新的事件系统,他和传统的事件区别在于,它可在元素树中向上冒泡传播或者向下隧道传播。
理解路由事件
理解路由事件最好的方法就是理解它的两个功能,冒泡传播和隧道传播。其实通过他们的名字就已经很明显的知道他们的含义了。冒泡传播顾名思义就是像水里冒泡一样,一层一层的向上移动。而隧道事件则相反,并且与冒泡事件成对出现,为了便于区分,隧道事件会在冒泡事件的前面加一个单词Preview。
定义,注册,封装一个路由事件
这里就是把书上的例子照搬过来了,如果是看过WPF编程宝典的这里就可以跳过了。例子讲的是Button的Click事件,上代码
public abstract class ButtonBase : ContentCotrol...
{
public static readonly RoutedEvent ClickEvent;
static ButtonBase()
{
ButtonBase.ClickEvent = EventManager.RegisterRoutedEvent(
"Click", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(ButtonBase));
}
public event RoutedEventHandler Click
{
add
{
base.AddHandler(ButtonBase.ClickEvent, value);
}
remove
{
base.RemoveHandler(ButtonBase.ClickEvent, value);
}
}
基本上和依赖项属性的定义方式类似。
附加事件
和附加属性类似,直接上代码
<Grid Button.Click="DoSomething">
<Button name="btn1"/>
<Button name="btn2"/>
<Button name="btn3"/>
</Grid>
Grid控件本身并没有Click事件,但是通过这样的方式,可以让Grid接收到所有内部Button的Click事件,这其实是一种很好的集合式处理方式。你只要在事件内部判断触发Click事件的Button,就能做出对应的操作。
鼠标和键盘事件
鼠标事件没什么好说的,大家平常多用应该就能掌握,但键盘事件有一个比较冷门的知识点,例子:再文本容器中写一个大写的字母,首先按下Shift,然后按下s键,这个例子触发的事件类型大致分为三类:KeyDown,TextInput,KeyUp。KeyDown和KeyUp事件的触发不用多做解释,他们是根据键盘的按键来触发的。但是TextInput的触发却不一样,这个例子虽然按下了两个按键,但TextInput却只触发了一次,因为它的触发取决于文本控件的Content变化。所以不管你前面按了几个键,直到按下的键在文本控件中留下内容才会触发TextInput。
写在结尾
总的来说,依赖项属性和路由事件在定义,注册和封装上异曲同工,也正是因为这种在旧功能上定义新功能的方式来创新功能所以达到了在不影响旧功能的情况下,又能按照旧功能的使用方式来使用新功能。听起来好像有点绕,其实我也不是很懂,感觉对使用的意义也不大,这些主要还是理论上的知识点。有需求的同学可以详细看看这版教材。