• wpf中EventHandler的使用


    应用情景:比如点击A界面的a按钮,跳转到B界面了,点击b按钮后,触发了业务逻辑,然后需要回到A界面中执行某一个方法。不是唯一的方法,可以使用别的方法,类似观察者模式,有变化了,就会改变。也可以理解一个界面向另一个界面发送消息。

    1.建立一个wpf程序,分别增加上述的界面和按钮以及逻辑,文件预览

    2.建立Common类

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace EventHandlerWPF
    7. {
    8. public static class Common
    9. {
    10. ///
    11. /// 定义事件
    12. ///
    13. public static event EventHandler bChangedEvent; //使用的地方注册事件
    14. public static void B() //B方法,别的调用
    15. {
    16. bChangedEvent?.Invoke(null, EventArgs.Empty); //只要此方法bChangedEvent注册了后,就会触发
    17. }
    18. }
    19. }

    3.MainWindow.xaml.cs代码

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.Windows;
    7. using System.Windows.Controls;
    8. using System.Windows.Data;
    9. using System.Windows.Documents;
    10. using System.Windows.Input;
    11. using System.Windows.Media;
    12. using System.Windows.Media.Imaging;
    13. using System.Windows.Navigation;
    14. using System.Windows.Shapes;
    15. namespace EventHandlerWPF
    16. {
    17. ///
    18. /// MainWindow.xaml 的交互逻辑
    19. ///
    20. public partial class MainWindow : Window
    21. {
    22. public MainWindow()
    23. {
    24. InitializeComponent();
    25. Common.bChangedEvent += Common_bChangedEvent; //必须注册
    26. }
    27. private void Button_Click(object sender, RoutedEventArgs e)
    28. {
    29. Window1 b = new Window1();
    30. b.ShowDialog();
    31. }
    32. private void Common_bChangedEvent(object sender, EventArgs e)
    33. { //点击B界面的b按钮后,这里首先触发。
    34. A();//业务处理
    35. }
    36. private void A()
    37. {
    38. MessageBox.Show("我是A"); //业务处理
    39. }
    40. }
    41. }

    4.Window1.xaml.cs

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.Windows;
    7. using System.Windows.Controls;
    8. using System.Windows.Data;
    9. using System.Windows.Documents;
    10. using System.Windows.Input;
    11. using System.Windows.Media;
    12. using System.Windows.Media.Imaging;
    13. using System.Windows.Shapes;
    14. namespace EventHandlerWPF
    15. {
    16. ///
    17. /// Window1.xaml 的交互逻辑
    18. ///
    19. public partial class Window1 : Window
    20. {
    21. public Window1()
    22. {
    23. InitializeComponent();
    24. }
    25. private void Button_Click(object sender, RoutedEventArgs e)
    26. {
    27. MessageBox.Show("我是B"); //业务处理
    28. Common.B(); //需要向A界面传递值
    29. }
    30. }
    31. }

    5.效果,可见,点击B界面的b按钮,进入了A界面的a方法中

    拓展

    解析wpf中事件的object和EventArgs

    此问题接着上面来说,如果要向事件里面传递参数,要向“真正”的事件那样做,应该如何做呢?其实在winform中也有事件,这个方法不仅WPF可以使用,winform也可以事件,其实都是.net的底层机制构造。

    1.项目文件预览

    2.Common.cs类

    这里还可以使用string,传递一个string或者其他泛型,然后下面去接收,就不用谢继承了。

      public static event EventHandler<string> bChangedEvent;    //使用的地方注册事件
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace EventHandlerWPF
    7. {
    8. public static class Common
    9. {
    10. ///
    11. /// 定义事件
    12. ///
    13. public static event EventHandler bChangedEvent; //使用的地方注册事件
    14. public static void B(object sender, B_EventArgs b_EventArgs) //B方法,别的调用
    15. {
    16. //补充:事件的参数是object sender, EventArgs e ,sender就是一个object类型,如果是按钮触发的,就是按钮的本身。
    17. bChangedEvent?.Invoke(sender, b_EventArgs); //只要此方法bChangedEvent注册了后,就会触发
    18. }
    19. }
    20. public class B_EventArgs : EventArgs //定义EventArgs的参数
    21. {
    22. public string Name { get; set; }
    23. public object obj { get; set; }
    24. }
    25. }

    3.MainWindow.xaml.cs

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.Windows;
    7. using System.Windows.Controls;
    8. using System.Windows.Data;
    9. using System.Windows.Documents;
    10. using System.Windows.Input;
    11. using System.Windows.Media;
    12. using System.Windows.Media.Imaging;
    13. using System.Windows.Navigation;
    14. using System.Windows.Shapes;
    15. namespace EventHandlerWPF
    16. {
    17. ///
    18. /// MainWindow.xaml 的交互逻辑
    19. ///
    20. public partial class MainWindow : Window
    21. {
    22. public MainWindow()
    23. {
    24. InitializeComponent();
    25. Common.bChangedEvent += Common_bChangedEvent; //必须注册
    26. }
    27. private void Button_Click(object sender, RoutedEventArgs e)
    28. {
    29. Window1 b = new Window1();
    30. b.ShowDialog();
    31. }
    32. private void Common_bChangedEvent(object sender, EventArgs e)
    33. { //点击B界面的b按钮后,这里首先触发。
    34. var btn = sender as Button;
    35. string name = (e as B_EventArgs).Name; //接收事件的参数
    36. object obj = (e as B_EventArgs).obj;
    37. A();//业务处理
    38. }
    39. private void A()
    40. {
    41. MessageBox.Show("我是A"); //业务处理
    42. }
    43. }
    44. }

    4.Window1.xaml.cs

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.Windows;
    7. using System.Windows.Controls;
    8. using System.Windows.Data;
    9. using System.Windows.Documents;
    10. using System.Windows.Input;
    11. using System.Windows.Media;
    12. using System.Windows.Media.Imaging;
    13. using System.Windows.Shapes;
    14. namespace EventHandlerWPF
    15. {
    16. ///
    17. /// Window1.xaml 的交互逻辑
    18. ///
    19. public partial class Window1 : Window
    20. {
    21. public Window1()
    22. {
    23. InitializeComponent();
    24. }
    25. private void Button_Click(object sender, RoutedEventArgs e)
    26. {
    27. MessageBox.Show("我是B"); //业务处理
    28. B_EventArgs b_EventArgs = new B_EventArgs();
    29. b_EventArgs.Name = "张三";
    30. b_EventArgs.obj = "真香";
    31. Common.B(b,b_EventArgs); //需要向A界面传递值 这里的b就是界面b按钮的名字
    32. }
    33. }
    34. }

    5.效果

    调试的时候,在A界面中,可以看到对应的值

    来源:wpf中EventHandler的使用_wpf eventhandler-CSDN博客

  • 相关阅读:
    九、Linux用户管理
    [算法][数组][leetcode]2391. 收集垃圾的最少总时间
    【Gzip】详细介绍
    Spring复杂对象的3中创建方法
    Pytorch学习task02_待补
    新手小白前端学习艰辛之路
    【HDFS】社区Router透传Client IP相关ISSUE的梳理及源码
    pytorch(小土堆)深度学习
    《Effective Java》知识点(3)--类和接口
    dgpnpsev启动项无效
  • 原文地址:https://blog.csdn.net/u012563853/article/details/126506198