直接事件模型或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. 在magento中定义static block

    在magento中如何调用static block?(系统面板内CMS---->static block) 解答:若想在站点页面的某个地方放点静态的内容,比如广告,或者是促销信息之类的,这样的东 ...

  2. [转]Visual Studio 2008中如何比较二个数据库的架构【Schema】和数据【Data】并同步

    使用场景: 在团队开发中,每一个人都有可能随时更新数据库,这时候数据库中数据和架构等信息都会发生变化.如果更新不及时,就会发生数据错误或数据丢失的风险,影响团队的开发效率和 项目进度,这时候我们该怎么 ...

  3. 在 IIS 中配置 ASP.NET 应用程序

     注意事项: 1.注册.NET 如果先安装.net平台,后安装IIS,那么在IIS中可能就没有出现ASP.NET版本的下拉菜单,就要手动注册: 一般.Net版本都存放在:C:\WINDOWS\Micr ...

  4. Java Tomcat Glassfish Weblogic远程debug(remote debug)

    tomcat ./catalina.sh jpda start 这条命令启动tomcat,它就会监听8000端口,等待调试器的连接. 默认监听8000端口,通过设置环境变量JPDA_ADDRESS指定 ...

  5. java反射入门

    http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html package reflectTest; class Demo{ / ...

  6. [树结构]平衡二叉树AVL

    平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高度至多等于1,平衡二叉树又称为AVL树. 将二叉树节点的左子树深度减去右子树深度的值称为平衡因子BF,平衡二叉树上所有节点的平衡因子只可能 ...

  7. MYSQL区分大小写

    MYSQL区分大小写   1.linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写: 2.用root帐号登录后,在/etc/my.cnf 中的[mysqld]后添加添加lower ...

  8. Flot chart学习笔记

    背景及相关简介 在最近的BS新项目中需要用到绘图数据显示的功能.在进行充足的选择之后决定才去开源的Flot.Flot是一个jQuery绘图库.主要用于简单的绘制图表功能.具有吸引人的渲染外观和互操作的 ...

  9. 航频卫士APP截图

  10. hdu 1695 GCD 容斥+欧拉函数

    题目链接 求 $ x\in[1, a] , y \in [1, b] $ 内 \(gcd(x, y) = k\)的(x, y)的对数. 问题等价于$ x\in[1, a/k] , y \in [1, ...