直接事件模型或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. 元数据(meta-data)

    本章所介绍的元数据的知识,可能在定制系统时会用到.因为那是后需要修改底层框架的一些内容 一.元数据的定义 在AndroidManifest.xml中如下书写: <activity android ...

  2. JQuery(上)

    1.流行的JavaScript类库   --  框架.插件 )为了简化 JavaScript 的开发, 一些 JavsScript 库诞生了. JavaScript 库封装了很多预定义的对象和实用函数 ...

  3. Apache经常使用配置

      Apache採用IBM HTTPServer,内核为Apache/2.0.47 Server version: IBM_HTTP_Server/6.1.0.13 Apache/2.0.47   查 ...

  4. Java学习笔记---继承和super的用法

    自从换了个视频教学,感觉比原来那个好多了,就是学校网速太渣,好多视频看一会卡半天,只能先看看已经下载的了. 不过也好,虽然不能从开始开始重新开,但是已经看过一次,在看一次也是好的,就当巩固学习了. 继 ...

  5. Sizzle之tokenize

    在Sizzle里,大体思路,当为复合选择器时,判断是否支持querySeletorAll,如果不支持则调用自写方法select. select的功能十分冗长,下面先分析tokenize 在tokeni ...

  6. char str[] 与 char *str的区别详细解析

    char* get_str(void) { char str[] = {"abcd"}; return str; } char str[] = {"abcd"} ...

  7. 菜鸟学java开篇

    从事it工作已有接近两年的时间了, 一直从事的是php的工作, 一直都想学java ,原因就不多说了, 毕竟优秀的php程序员,都会是一个其他方面的高手, 例如java ,并不是说java有多好,ph ...

  8. Linux网络管理——Linux网络命令

    3. Linux网络命令 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...

  9. Android TextView文字超出一屏不能显示其它的文字 解决方案

    在android上面让TextView 过多的文字实现有滚动条,之前想简单了以为设置TextView的属性就可以实现,结果还是需要ScrollView配合使用,才能达到滚动条的效果有两种方式实现, 一 ...

  10. hdu 5652 India and China Origins 二分+bfs

    题目链接 给一个图, 由01组成, 1不能走. 给q个操作, 每个操作将一个点变为1, 问至少多少个操作之后, 图的上方和下方不联通. 二分操作, 然后bfs判联通就好了. #include < ...