WPF MVVM模式下路由事件
一,路由事件下三种路由策略:
1 冒泡:由事件源向上传递一直到根元素。2直接:只有事件源才有机会响应事件。3隧道:从元素树的根部调用事件处理程序并依次向下深入直到事件源。一般情况下,WPF提供的输入事件都是以隧道/冒泡对实现的。隧道事件常常被称为Preview事件。
二,MVVM简单的路由注册事件
.CS
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
//这里使用了Preview事件
EventManager.RegisterClassHandler(typeof(Grid), Grid.PreviewMouseLeftButtonDownEvent, new RoutedEventHandler(OnClick));
}
void OnClick(object sender, RoutedEventArgs e)
{ if (e.Source is Button)
{
MessageBox.Show($"{Grid.GetRow((e.Source as Button))}:{(e.Source as Button).Name}" );
}
}
}
.XAML
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="50"></RowDefinition>
<RowDefinition Height="50"></RowDefinition>
<RowDefinition Height="50"></RowDefinition>
</Grid.RowDefinitions>
<Button x:Name="Grid1" Width="50" HorizontalContentAlignment="Center" >1</Button>
<Button Grid.Row="1" x:Name="Grid2" Width="50" >2</Button>
</Grid>
效果

三,自定义路由事件
1,创建一个BottonV类
class BottonV:Button
{ //第一步:声明并注册【路由事件】
//EventManager.RegisterRoutedEvent(CLR事件包装器名称,路由事件冒泡策略,事件处理程序的类型,路由事件的所有者类类型)
public static readonly RoutedEvent OpenEvent = EventManager.RegisterRoutedEvent("Open", RoutingStrategy.Bubble, typeof(EventHandler<CustomRouting>), typeof(BottonV));
//第二步:为路由事件添加CLR事件包装器
public event RoutedEventHandler Open
{
//为指定的路由事件添加路由事件处理程序,并将该处理程序添加到当前元素的处理程序集合中。
add { this.AddHandler(OpenEvent, value); }
remove { this.RemoveHandler(OpenEvent, value); } }
//第三步:激发路由事件
protected override void OnClick()
{
base.OnClick();
//创建事件携带信息(RoutedEventArgs类实例),并和路由事件关联
CustomRouting args = new CustomRouting(OpenEvent, this);
args.EventTime = DateTime.Now;
//调用元素的RaiseEvent方法(继承自UIElement类),引发路由事件
this.RaiseEvent(args);
}
}
2,定义一个路由
/// <summary>
/// 继承RoutedEventArgs
/// </summary>
public class CustomRouting:RoutedEventArgs
{
public CustomRouting(RoutedEvent routedEvent, object source) : base(routedEvent, source) { }
public DateTime EventTime { get; set; } }
3,MainWindow页面创建一个路由事件
private void TimeButton_ReportTime(object sender, CustomRouting e)//注意参数
{
MessageBox.Show(e.EventTime.ToLongTimeString() + (sender as FrameworkElement).Name);
}
效果如下:

WPF MVVM模式下路由事件的更多相关文章
- wpf mvvm模式下CommandParameter传递多参
原文:wpf mvvm模式下CommandParameter传递多参 CommandParameter一般只允许设置一次,所以如果要传递多参数,就要稍微处理一下.我暂时还没找到更好的方案,下面介绍的这 ...
- WPF MVVM模式下ComboBox级联效果 选择第一项
MVVM模式下做的省市区的级联效果.通过改变ComboBox执行命令改变市,区. 解决主要问题就是默认选中第一项 1.首先要定义一个属性,继承自INotifyPropertyChanged接口.我这里 ...
- WPF MVVM模式下的无阻塞刷新探讨
很多时候我们需要做一个工作,在一个方法体里面,读取大数据绑定到UI界面,由于长时间的读取,读取独占了线程域,导致界面一直处于假死状态.例如,当应用程序开始读取Web资源时,读取的时效是由网络链路的速度 ...
- WPF MVVM模式下实现ListView下拉显示更多内容
在手机App中,如果有一个展示信息的列表,通常会展示很少一部分,当用户滑动到列表底部时,再加载更多内容.这样有两个好处,提高程序性能,减少网络流量.这篇博客中,将介绍如何在WPF ListView中实 ...
- wpf mvvm模式下 在ViewModel关闭view
本文只是博主用来记录笔记,误喷 使用到到了MVVM中消息通知功能 第一步:在需要关闭窗体中注册消息 public UserView() { this.DataContext = new UserVie ...
- wpf mvvm模式下的image绑定
view文件 <Image Grid.Column="2" Width="48" Height="64" Stretch=" ...
- WPF中在MVVM模式下,后台绑定ListCollectionView事件触发问题
问题:WPF中MVVM模式下 ListView绑定ListCollectionView时,CurrentChanged无法触发 解决方案: 初期方案:利用ListView的SelectionChang ...
- MVVM模式下WPF动态绑定展示图片
MVVM模式下WPF动态展示图片,界面选择图标,复制到项目中固定目录下面,保存到数据库的是相对路径,再次读取的时候是根据数据库的相对路径去获取项目中绝对路径的图片展示. 首先在ViewModel中 / ...
- WPF实战案例-MVVM模式下在Xaml中弹出窗体
相信很多学习和开发wpf项目的同学都了解过mvvm模式,同样,在mvvm模式下会有一个不可忽视的问题,就是怎么在xaml中弹出窗体,而不破坏MVVM本身的结构. 关于弹出窗体的方式还是很多的,本文先讲 ...
随机推荐
- Git上传代码遇到的报错
Git上传代码遇到的报错 1.git上传代码卡住(Total 7072 (delta 2508), reused 6844 (delta 2376), pack-reused 0) git confi ...
- Java程序设计(2021春)——第一章续笔记与思考
Java程序设计(2021春)--第一章续笔记与思考 目录 Java程序设计(2021春)--第一章续笔记与思考 Java数据类型 基本数据类型 引用类型 基本数据类型--整数类型的细节 基本数据类型 ...
- 万字长文:SpringCloud gateway入门学习&实践
官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/# ...
- 最常见的安全漏洞– Acunetix Web应用程序漏洞报告2021
每年,Acunetix都会为您提供最常见的Web安全漏洞和网络外围漏洞的分析.我们的年度Web应用程序漏洞报告(现已成为Invicti AppSec指标的一部分)是基于从Acunetix在线获得的真实 ...
- C++11运算符重载详解与向量类重载实例(<<,>>,+,-,*等)
1. C++运算符重载介绍 C ++ 中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C ++ 中重新定义这些运算符,赋予已 ...
- STM32中的通信协议
按照数据传送方式分: 串行通信(一条数据线.适合远距离传输)并行通信(多条数据线.成本高.抗干扰性差) 按照通信的数据同步方式分: 异步通信(以1个字符为1帧.发送与接收时钟不一致)同步通信(位同步. ...
- ZSH主题
All the current themes can be found in the themes/ directory in the oh-my-zsh distribution. See list ...
- python chrome
from selenium.webdriver.chrome.options import Options from selenium import webdriver wd = webdriver. ...
- python 并行
网址:http://www.parallelpython.com/ 下载模块[根据使用环境选择相应的下载版本]下载pp-1.6.4.4 .zip,注意不要下载md5 解压缩上面下载的文件:pp-1.6 ...
- SECURECRT 连接锐捷交换机CONSOLE
协议选择Serial,端口选择COM1.波特率设置为9600.RTS/CTS要把勾去掉(关闭流控功能)