应用情景:比如点击A界面的a按钮,跳转到B界面了,点击b按钮后,触发了业务逻辑,然后需要回到A界面中执行某一个方法。不是唯一的方法,可以使用别的方法,类似观察者模式,有变化了,就会改变。也可以理解一个界面向另一个界面发送消息。
1.建立一个wpf程序,分别增加上述的界面和按钮以及逻辑,文件预览
2.建立Common类
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace EventHandlerWPF
- {
- public static class Common
- {
- ///
- /// 定义事件
- ///
- public static event EventHandler bChangedEvent; //使用的地方注册事件
-
- public static void B() //B方法,别的调用
- {
- bChangedEvent?.Invoke(null, EventArgs.Empty); //只要此方法bChangedEvent注册了后,就会触发
- }
- }
- }
3.MainWindow.xaml.cs代码
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
-
- namespace EventHandlerWPF
- {
- ///
- /// MainWindow.xaml 的交互逻辑
- ///
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- Common.bChangedEvent += Common_bChangedEvent; //必须注册
- }
-
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- Window1 b = new Window1();
- b.ShowDialog();
- }
-
- private void Common_bChangedEvent(object sender, EventArgs e)
- { //点击B界面的b按钮后,这里首先触发。
- A();//业务处理
- }
-
- private void A()
- {
- MessageBox.Show("我是A"); //业务处理
- }
- }
- }
4.Window1.xaml.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Shapes;
-
- namespace EventHandlerWPF
- {
- ///
- /// Window1.xaml 的交互逻辑
- ///
- public partial class Window1 : Window
- {
- public Window1()
- {
- InitializeComponent();
- }
-
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- MessageBox.Show("我是B"); //业务处理
- Common.B(); //需要向A界面传递值
- }
- }
- }
5.效果,可见,点击B界面的b按钮,进入了A界面的a方法中
拓展
解析wpf中事件的object和EventArgs
此问题接着上面来说,如果要向事件里面传递参数,要向“真正”的事件那样做,应该如何做呢?其实在winform中也有事件,这个方法不仅WPF可以使用,winform也可以事件,其实都是.net的底层机制构造。
1.项目文件预览
2.Common.cs类
这里还可以使用string,传递一个string或者其他泛型,然后下面去接收,就不用谢继承了。
public static event EventHandler<string> bChangedEvent; //使用的地方注册事件
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace EventHandlerWPF
- {
- public static class Common
- {
- ///
- /// 定义事件
- ///
- public static event EventHandler bChangedEvent; //使用的地方注册事件
-
- public static void B(object sender, B_EventArgs b_EventArgs) //B方法,别的调用
- {
- //补充:事件的参数是object sender, EventArgs e ,sender就是一个object类型,如果是按钮触发的,就是按钮的本身。
- bChangedEvent?.Invoke(sender, b_EventArgs); //只要此方法bChangedEvent注册了后,就会触发
- }
- }
-
- public class B_EventArgs : EventArgs //定义EventArgs的参数
- {
- public string Name { get; set; }
- public object obj { get; set; }
- }
-
- }
3.MainWindow.xaml.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
-
- namespace EventHandlerWPF
- {
- ///
- /// MainWindow.xaml 的交互逻辑
- ///
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- Common.bChangedEvent += Common_bChangedEvent; //必须注册
- }
-
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- Window1 b = new Window1();
- b.ShowDialog();
- }
-
- private void Common_bChangedEvent(object sender, EventArgs e)
- { //点击B界面的b按钮后,这里首先触发。
-
- var btn = sender as Button;
-
- string name = (e as B_EventArgs).Name; //接收事件的参数
- object obj = (e as B_EventArgs).obj;
- A();//业务处理
- }
-
- private void A()
- {
- MessageBox.Show("我是A"); //业务处理
- }
- }
- }
4.Window1.xaml.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Shapes;
-
- namespace EventHandlerWPF
- {
- ///
- /// Window1.xaml 的交互逻辑
- ///
- public partial class Window1 : Window
- {
- public Window1()
- {
- InitializeComponent();
- }
-
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- MessageBox.Show("我是B"); //业务处理
- B_EventArgs b_EventArgs = new B_EventArgs();
- b_EventArgs.Name = "张三";
- b_EventArgs.obj = "真香";
- Common.B(b,b_EventArgs); //需要向A界面传递值 这里的b就是界面b按钮的名字
- }
- }
- }
5.效果
调试的时候,在A界面中,可以看到对应的值