直接事件模型或CLR事件模型

1事件拥有者

2事件响应者

3事件订阅关系

例如 Window窗口中的控件Button

事件:拥有者Button

事件:Button.Click

事件响应者:Window

事件处理器:Button_click(…..)

事件订阅 Button.Click+=new system.EventHandle(this.Button_Click)

CLR事件模型中事件的拥有者也就是消息的发送者(sender)

private void button_Click(object sender, RoutedEventArgs e)

{

if(sender is Button)

{

MessageBox.Show((sender as Button).Name);

}

}

缺点:事件拥有者与事件的响应者必须建立订阅这条专线,

路由事件

系统路由事件

事件的拥有者只负责激发事件,事件响应者则安装事件侦听器,当有此类型的事件传递至此时,事件响应者就使用事件处理器来响应事件并决定是否事件可以继续传递
路由事件是从叶-----------》根传播的

注册侦听器

C#

this.window.AddHandler(Button.ClickEvent, new
RoutedEventHandler(this.buutonClick))
;

XAML

<Grid x:Name="gridroot" Margin="10" Button.Click="buutonClick">

Event

private void buutonClick(object sender,
RoutedEventArgs e)

{

MessageBox.Show((e.OriginalSource as Button).Name);

}

自定义路由事件

编写携带参数的事件消息类

1, public  class ReportTimeEventArgs:RoutedEventArgs

2,     {

3,       public
ReportTimeEventArgs(RoutedEvent routedEvent, object source) : base(routedEvent,
source) { }

4,       public DateTime ClickTime { get; set; }

5, 
    }

编写路由事件类

public class TimeButton:Button

{

public static readonly RoutedEvent ReprotTimeEvent=

EventManager.RegisterRoutedEvent("ReprotTime",

RoutingStrategy.Bubble,typeof(EventHandler<ReportTimeEventArgs>),typeof(TimeButton));

// CLR事件包装器作用是把事件路由暴露的像一个直接事件一样类似于属行

public event RoutedEventHandler ReprotTime

{

add{ this.AddHandler(ReprotTimeEvent,value);}

remove{this.RemoveHandler(ReprotTimeEvent,value);}

}

protected override void OnClick()

{

base.OnClick();

ReportTimeEventArgs args = new ReportTimeEventArgs(ReprotTimeEvent,this);//准备事消息

args.ClickTime = DateTime.Now;

this.RaiseEvent(args);

}

}

注册侦听器

<Grid local:TimeButton.ReprotTime="ReprotTimeClick" x:Name="gridroot">
<Grid local:TimeButton.ReprotTime="ReprotTimeClick" x:Name="grid1">
<Grid local:TimeButton.ReprotTime="ReprotTimeClick" x:Name="grid2">
<StackPanel local:TimeButton.ReprotTime="ReprotTimeClick" x:Name="stackPanel">
<ListBox Background="BlueViolet" local:TimeButton.ReprotTime="ReprotTimeClick" x:Name="listBox1">
<local:TimeButton x:Name="timeButton" Width="80" Height="80" Content="报时" local:TimeButton.ReprotTime="ReprotTimeClick"></local:TimeButton>
</ListBox>
</StackPanel>
</Grid>
</Grid>

</Grid>

RoutingStrategy.Bubble,参数指定WPF路由事件的三种策略

1, Bubble(冒泡式):从事件的激发着出发向它上级容器一层一层路由,即有Button 到
window

2        
Tunnel(隧道式):与冒泡式相反有Window到Button

3      
3Direct(直达式)直接将消息送达事件处理器

WPF事件,路由事件的更多相关文章

  1. 学习WPF——了解路由事件

    入门 我们先来看一个例子 前台代码: 后台代码: 点击按钮的运行效果第一个弹出窗口 第二个弹出窗口: 第三个弹出窗口: 说明 当点击按钮之后,先触发按钮的click事件,再上查找,发现stackpan ...

  2. 【WPF】路由事件

    总结WPF中的路由事件,我将学到的内容分为四部分来逐渐掌握 第一部分:wpf中内置的路由事件 以Button的Click事件来说明内置路由事件的使用 XAML代码: <Window x:Clas ...

  3. WPF - 善用路由事件

    原文:WPF - 善用路由事件 在原来的公司中,编写自定义控件是常常遇到的任务.但这些控件常常拥有一个不怎么好的特点:无论是内部还是外部都没有使用路由事件.那我们应该怎样宰自定义控件开发中使用路由事件 ...

  4. WPF的路由事件、冒泡事件、隧道事件(预览事件)

    本文摘要: 1:什么是路由事件: 2:中断事件路由: 3:自定义路由事件: 4:为什么需要自定义路由事件: 5:什么是冒泡事件和预览事件(隧道事件): 1:什么是路由事件 WPF中的事件为路由事件,所 ...

  5. WPF:自定义路由事件的实现

    路由事件通过EventManager,RegisterRoutedEvent方法注册,通过AddHandler和RemoveHandler来关联和解除关联的事件处理函数:通过RaiseEvent方法来 ...

  6. 迟到的 WPF 学习 —— 路由事件

    1. 理解路由事件:WPF 通过事件路由(event routing)概念增强了传统的事件执行的能力和范围,允许源自某个元素的事件由另一个元素引发,例如,事件路由允许工具栏上的一个按钮点击的事件在被代 ...

  7. WPF自定义路由事件(二)

    WPF中的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件. 1.WPF内置路由事件 WPF ...

  8. WPF中路由事件的传播

    路由事件(RoutedEvent)是WPF中新增的事件,使用起来与传统的事件差别不大, 但传播方式是完全不同的. 路由事件的传播方式 通过RoutingStrategy来定义传播的方式 public ...

  9. WPF 冒泡路由事件

    在WPF中,例如,可以构建一个包含图形的按钮,创建一个具有文本和图片混合内容的标签,或者为了实现滚动或折叠的显示效果在一个特定的容器中放置内容.甚至可以多此重复嵌套,直到达到您所希望的层次深度. 这种 ...

随机推荐

  1. Introducing Regular Expressions 学习笔记

    Introducing Regular Expressions 读书笔记 工具: regexbuddy:http://download.csdn.net/tag/regexbuddy%E7%A0%B4 ...

  2. getBoundingClientRect()来获取页面元素的位置”

    getBoundingClientRect()来获取页面元素的位置” 获取的是一个对象; 延伸阅读; https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA== ...

  3. oracle 命令创建用户 、授权、数据库导入、导出

    最近在使用oracle,经常要导入导出数据,命令很简单,却经常忘记,所以记下来.. drop user yfplss cascade;--登录system用户删除已存在的用户名,该用户下的所有东西都被 ...

  4. context.drawImage绘制图片

    context.drawImage(img,x,y)  x,y图像起始坐标 context.drawImage(img,x,y,w,h) w,h指定图像的宽度和高度 context.drawImage ...

  5. 使用logstash收集日志的可靠性验证

    实时计算里,需要对日志实时收集,logstash可以做到.目前的版本是1.4.2,官方文档在http://www.logstash.net/docs/1.4.2/,里面有详细的配置说明,使用也很简单. ...

  6. ajax 实例

    jsp页面代码: <script type="text/javascript"> var xmlHttp; function createXMLHttp(){ if(w ...

  7. SQL Server执行计划那些事儿(2)——查找和扫描

    接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. ...

  8. $(function() {});和$(document).ready(function() {});区别

    第一个是直接使用Jquery调用function,第二个是在文档加载完毕后才去调用function

  9. Spring 4.0 中的 WebSocket 架构

    两年前,客户端与服务器端的全双工双向通信作为一个很重要的功能被纳入到WebSocket RFC 6455协议中.在HTML5中,WebSocket已经成为一个流行词,大家对这个功能赋予很多构想,很多时 ...

  10. java.util.vector中的vector的详细用法

    ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.util.*; /** * 演示Vector的使用.包括Vector的创 ...