WPF事件,路由事件
直接事件模型或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事件,路由事件的更多相关文章
- 学习WPF——了解路由事件
入门 我们先来看一个例子 前台代码: 后台代码: 点击按钮的运行效果第一个弹出窗口 第二个弹出窗口: 第三个弹出窗口: 说明 当点击按钮之后,先触发按钮的click事件,再上查找,发现stackpan ...
- 【WPF】路由事件
总结WPF中的路由事件,我将学到的内容分为四部分来逐渐掌握 第一部分:wpf中内置的路由事件 以Button的Click事件来说明内置路由事件的使用 XAML代码: <Window x:Clas ...
- WPF - 善用路由事件
原文:WPF - 善用路由事件 在原来的公司中,编写自定义控件是常常遇到的任务.但这些控件常常拥有一个不怎么好的特点:无论是内部还是外部都没有使用路由事件.那我们应该怎样宰自定义控件开发中使用路由事件 ...
- WPF的路由事件、冒泡事件、隧道事件(预览事件)
本文摘要: 1:什么是路由事件: 2:中断事件路由: 3:自定义路由事件: 4:为什么需要自定义路由事件: 5:什么是冒泡事件和预览事件(隧道事件): 1:什么是路由事件 WPF中的事件为路由事件,所 ...
- WPF:自定义路由事件的实现
路由事件通过EventManager,RegisterRoutedEvent方法注册,通过AddHandler和RemoveHandler来关联和解除关联的事件处理函数:通过RaiseEvent方法来 ...
- 迟到的 WPF 学习 —— 路由事件
1. 理解路由事件:WPF 通过事件路由(event routing)概念增强了传统的事件执行的能力和范围,允许源自某个元素的事件由另一个元素引发,例如,事件路由允许工具栏上的一个按钮点击的事件在被代 ...
- WPF自定义路由事件(二)
WPF中的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件. 1.WPF内置路由事件 WPF ...
- WPF中路由事件的传播
路由事件(RoutedEvent)是WPF中新增的事件,使用起来与传统的事件差别不大, 但传播方式是完全不同的. 路由事件的传播方式 通过RoutingStrategy来定义传播的方式 public ...
- WPF 冒泡路由事件
在WPF中,例如,可以构建一个包含图形的按钮,创建一个具有文本和图片混合内容的标签,或者为了实现滚动或折叠的显示效果在一个特定的容器中放置内容.甚至可以多此重复嵌套,直到达到您所希望的层次深度. 这种 ...
随机推荐
- 【思路解析】discuz 帖子设置封面 setthreadcover 表pre_forum_threadimage
在Discuz 中有一项就是给帖子设置封面,很多情况下只能通过手动的方式去设置或者用提交POST请求的式去设置: 但是这都是调用DISCUZ的功能设置的: 有的时候并非万能的,也有用不到的时候:下面就 ...
- hdu 5583 Kingdom of Black and White(模拟,技巧)
Problem Description In the Kingdom of Black and White (KBW), there are two kinds of frogs: black fro ...
- CSS中链接文本为图片时的问题(塌陷、对应的图片建立倒角的问题)
我在做Javascript DOM编程艺术的时候,在12章自己做练习时遇到了一个问题,<a>的内容<img>从<a>的盒子中溢出.代码如下: <a href= ...
- C++ char和string的区别
'a'是char, "a"是char string,这两者都是普通的字符和字符串,和C中没什么不同 值得注意的是后者包含两个字符,末尾有一个隐身的'\0'而:string str ...
- 树 -- AVL树
前言 通过之前对二叉查找树的讨论,我们知道在给定节点数目的情况下,二叉树的高度越低,查找所用时间也就越短. 在讨论红黑树的时候,我们说过红黑树并非完全"平衡"的二叉树,只是近似&q ...
- 常用的ASCII码对照表
- Android Studio常用小技巧
1. Debug 模式查看变量的值: To quickly evaluate the value of any expression while debugging the program, hold ...
- 在网页中使用javascript提供反馈信息
一,使用document.write() 二,使用window方法,prompt(),alert()和confirm() <html lang="en"> < ...
- PHP MySql数据库访问
PHP MySql数据库访问 计应134 凌豪 1.MySql数据库的连接 要操作MySql数据库,首先必须与MySQl数据库建立连接,连接MySQL服务器的语句如下: <?php$link ...
- python执行shell命令
1 os.system 可以返回运行shell命令状态,同时会在终端输出运行结果 例如 ipython中运行如下命令,返回运行状态status os.system('cat /etc/passwdqc ...