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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   可乐_加冰  阅读(1030)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示