WPF之路由事件的理解
博客园上讲解路由事件的文章很多,在此转其中之一供学习参考:
https://www.cnblogs.com/zhili/p/WPFRouteEvent.html
网上流传的文章中都对冒泡进行了说明,但都是千遍一律,那在实际使用中如何才能使用一冒泡的路由事件呢?
<Grid x:Name="GridRoot" Background="Lime" Button.Click="Button_Click">
<Grid x:Name="GridA" Margin="10" Background="Blue" Button.Click="Button_Click">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Canvas x:Name="CanvasLeft" Grid.Column="0" Background="Red" Margin="10" >
<Button x:Name="ButtonLeft" Width="65" Height="100" Margin="10" Content="Left" Button.Click="Button_Click"></Button>
</Canvas>
<Canvas x:Name="CanvasRight" Grid.Column="1" Background="Yellow" Margin="10" Button.Click="Button_Click">
<Button x:Name="ButtonRight" Width="65" Height="100" Margin="10" Content="Right" Button.Click="Button_Click"></Button>
</Canvas>
</Grid>
如上代码所示:
1.冒泡事件是从”内往外“传递,但并不是每个节点都必需要有该事件。如上Canvas 节点并没有Button.Click="Button_Click";
2.每一节点并不是必须都是同一事件,例如将Grid 节点的Button.Click="Button_Click"可改为Button.Click="Button_Click0000",而Button_Click0000事件处理程序可以是不同于Button_Click的处理逻辑;
3.冒泡的路由事件应用场景之一:假如需要自己定义一个新的控件类型AA,AA的模板中包含一个lable的控件,此时AA并不能”触发“点击事件,但lable有点击事件,这时就可以把lable的点击事件作为附加事件给AA,当点击AA控件时,这时就能”触发“事件了。(路由事件实际是由控件节点进行”监听“,”监听“到事件到了就会执行事件处理程序,并不是”触电发“,这里说的触发只是一个便于理解的表象)
请看以下代码:
利用VS自定义一个AA的控件,以下是默认产生的代码:
public class AA : Control
{
static AA()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(AA), new FrameworkPropertyMetadata(typeof(AA)));
}
}
<Style TargetType="{x:Type local:AA}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:AA}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Label Content="123" Background="{TemplateBinding Background}"></Label>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
除了第8行代码是自己加的,其它代码都是自动产生的。可自定义的控件AA里面什么都没有,在此我放了一个lable在里面。下面是将lable的mouseDown事件附加到AA上去,使在点击AA时,AA的背景色改变。
<Grid x:Name="GridRoot" Background="Lime" Button.Click="Button_Click1">
<local:AA x:Name="aa" Label.MouseDown="Button_Click" Background="Green">
</local:AA>
</Grid>
private void Button_Click(object sender, RoutedEventArgs e)
{
this.aa.Background = Brushes.Red;
}
当点击AA时背景就会由绿色变成红色。
这个很简单的代码,记录了冒泡事件的应用场景之一。
WPF之路由事件的理解的更多相关文章
- WPF - 善用路由事件
原文:WPF - 善用路由事件 在原来的公司中,编写自定义控件是常常遇到的任务.但这些控件常常拥有一个不怎么好的特点:无论是内部还是外部都没有使用路由事件.那我们应该怎样宰自定义控件开发中使用路由事件 ...
- 迟到的 WPF 学习 —— 路由事件
1. 理解路由事件:WPF 通过事件路由(event routing)概念增强了传统的事件执行的能力和范围,允许源自某个元素的事件由另一个元素引发,例如,事件路由允许工具栏上的一个按钮点击的事件在被代 ...
- 细说WPF自定义路由事件
WPF中的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件. 1.WPF内置路由事件 W ...
- WPF 之路由事件和附加事件(六)
一.消息驱动与直接事件模型 事件的前身是消息(Message).Windows 是消息驱动的系统,运行其上的程序也遵循这个原则.消息的本质就是一条数据,这条消息里面包含着消息的类别,必要的时候还记 ...
- WPF的路由事件、冒泡事件、隧道事件(预览事件)
本文摘要: 1:什么是路由事件: 2:中断事件路由: 3:自定义路由事件: 4:为什么需要自定义路由事件: 5:什么是冒泡事件和预览事件(隧道事件): 1:什么是路由事件 WPF中的事件为路由事件,所 ...
- WPF:自定义路由事件的实现
路由事件通过EventManager,RegisterRoutedEvent方法注册,通过AddHandler和RemoveHandler来关联和解除关联的事件处理函数:通过RaiseEvent方法来 ...
- 学习WPF——了解路由事件
入门 我们先来看一个例子 前台代码: 后台代码: 点击按钮的运行效果第一个弹出窗口 第二个弹出窗口: 第三个弹出窗口: 说明 当点击按钮之后,先触发按钮的click事件,再上查找,发现stackpan ...
- 【WPF】路由事件
总结WPF中的路由事件,我将学到的内容分为四部分来逐渐掌握 第一部分:wpf中内置的路由事件 以Button的Click事件来说明内置路由事件的使用 XAML代码: <Window x:Clas ...
- Wpf自定义路由事件
创建自定义路由事件大体可以分为三个步骤: ①声明并注册路由事件. ②为路由事件添加CLR事件包装. ③创建可以激发路由事件的方法. 以ButtonBase类中代码为例展示这3个步骤: public a ...
随机推荐
- Java多线程编程(三)线程间通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- 设计模式(二十一)Proxy模式
在面向对象编程中,“本人”和“代理人”都是对象.如果“本人”对象太忙了,有些工作无法自己亲自完成,就将其交给“代理人”对象负责. 示例程序的类图. 示例程序的时序图.从这个时序图可以看出,直到调用pr ...
- C++:类中创建线程
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <iostream&g ...
- PhpStudy2018后门漏洞预警及漏洞复现&检测和执行POC脚本
PhpStudy2018后门漏洞预警及漏洞复现&检测和执行POC脚本 phpstudy介绍 Phpstudy是国内的一款免费的PHP调试环境的程序集成包,其通过集成Apache.PHP.MyS ...
- C++学习笔记1_ 指针.引用
1.引用的本质struct typeA{ int &a;}struct typeB{ int *a;}int main(void){ cout<<sizeof(struct typ ...
- MIT线性代数:11.矩阵空间、秩1矩阵和小世界图
- Linux 下的 redis安装
官网下载链接:https://redis.io/download redis安装流程,记录自己的实践,分享给需要的人. 1.选择Stable(5.0)下的Download 5.0.0 链接进行下载 ( ...
- 使用Typescript重构axios(十)——异常处理:增强版
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- [网络]HTTP
HTTP HTTP 简介 HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本 ...
- vue , debounce 使用
有时候不想直接在methods中的方法前面加debounce, getFullName: debounce(function() { console.log('my fullname is chent ...