wpf中EventHandler的使用

应用情景:比如点击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
    {
        /// <summary>
        /// 定义事件
        /// </summary>
        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
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    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
{
    /// <summary>
    /// Window1.xaml 的交互逻辑
    /// </summary>
    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
    {
        /// <summary>
        /// 定义事件
        /// </summary>
        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
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    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
{
    /// <summary>
    /// Window1.xaml 的交互逻辑
    /// </summary>
    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界面中,可以看到对应的值

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故里2130

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值