WPF MVVM模式下路由事件
一,路由事件下三种路由策略:
1 冒泡:由事件源向上传递一直到根元素。2直接:只有事件源才有机会响应事件。3隧道:从元素树的根部调用事件处理程序并依次向下深入直到事件源。一般情况下,WPF提供的输入事件都是以隧道/冒泡对实现的。隧道事件常常被称为Preview事件。
二,MVVM简单的路由注册事件
.CS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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
1 2 3 4 5 6 7 8 9 | <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|0效果
三,自定义路由事件
1,创建一个BottonV类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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,定义一个路由
1 2 3 4 5 6 7 8 9 | /// <summary> /// 继承RoutedEventArgs /// </summary> public class CustomRouting:RoutedEventArgs { public CustomRouting(RoutedEvent routedEvent, object source) : base (routedEvent, source) { } public DateTime EventTime { get ; set ; } } |
3,MainWindow页面创建一个路由事件
1 2 3 4 | private void TimeButton_ReportTime( object sender, CustomRouting e) //注意参数 { MessageBox.Show(e.EventTime.ToLongTimeString() + (sender as FrameworkElement).Name); } |
效果如下:
__EOF__

本文作者:可乐加冰
本文链接:https://www.cnblogs.com/zt199510/p/13543766.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/zt199510/p/13543766.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库