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中对三维模型的控制
原文:WPF中对三维模型的控制 (以下选自南开大学出版社出版的<WPF和Silverlight教程>) 3Dmax中的建模模型可以导出为obj文件格式,将此文件导入WPF项目中,由WPF完 ...
- WPF中使用Hashtable剔除重复字符串(比如电话号码)
WPF中使用Hashtable剔除重复字符串(比如电话号码) 原文:WPF中使用Hashtable剔除重复字符串(比如电话号码) 本文中的输入框中的字符串是逗号隔开的,你可以换成其他特别的字符串. 本 ...
- 了解 WPF 中的路由事件和命令
目录 路由事件概述 WPF 元素树 事件路由 路由事件和组合 附加事件 路由命令概述 操作中的路由命令 命令路由 定义命令 命令插入 路由命令的局限 避免命令出错 超越路由命令 路由处理程序示例 要想 ...
- CleanAOP实战系列--WPF中MVVM自动更新
CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: jarvin_g@126.com QQ: 511363759 CleanAOP介绍:https://github.com/J ...
- [转]在WPF中自定义控件 UserControl
在这里我们将将打造一个UserControl(用户控件)来逐步讲解如何在WPF中自定义控件,并将WPF的一些新特性引入到自定义控件中来. 我们制作了一个带语音报时功能的钟表控件, 效果如下: 在VS中 ...
- WPF中的路由事件(转)
出处:https://www.cnblogs.com/JerryWang1991/archive/2013/03/29/2981103.html 最近因为工作需要学习WPF方面的知识,因为以前只关注的 ...
- WPF中TreeView.BringIntoView方法的替代方案
WPF中TreeView.BringIntoView方法的替代方案 周银辉 WPF中TreeView.BringIntoView()方法并不是那么地好用,不少时候会没有效果,这里有一个替代方案,调用S ...
- 解读WPF中的Xaml
1.Overview 这篇文章主要分享从源代码角度解读wpf中xaml.由于源码查看起来错综复杂"随便找一个对象按下F12就是一个新的世界",看源码的感觉就是在盗梦空间里来回穿梭: ...
- WPF中的动画——(一)基本概念
原文:WPF中的动画--(一)基本概念 WPF的一个特点就是支持动画,我们可以非常容易的实现漂亮大方的界面.首先,我们来复习一下动画的基本概念.计算机中的动画一般是定格动画,也称之为逐帧动画,它通过每 ...
最新文章
- 在Windows下编译FFmpeg详细说明
- 向量点乘 推导及应用
- 为什么计算机有信息记忆功能,为什么计算机有记忆能力
- C语言实用算法系列之时间族函数、目录遍历
- 云计算未来趋势预测:AIaaS、无服务器、云端一体化等将成重点?
- ubuntu常见问题
- java删除javaee_JavaEE--集合--删除List中指定元素
- JAVA设计模式之抽象工厂模式和代理模式
- 数据库比特币勒索病毒攻击警示,云和恩墨技术通讯六月刊精选
- theano学习指南5(翻译)- 降噪自动编码器
- github生成燃尽图
- 脑波控制机械手,双手打字也无法自证清白| Science Robotics
- 计算机刷bios版本,怎么升级Bios?教你快速更新升级Bios
- RTL8152网卡灯配置详细说明
- 马科维茨投资组合理论
- SAPlink 的初次使用
- 使用ServiceMonitor管理配置监控
- acml会议级别_ACL-NLP顶级会议
- PCL——点云特征描述与提取
- postgis——几何图形创建使用
热门文章
- 微软ADFS成本评估
- Python|装饰器|执行时间|递归|动态属性|静态方法和类|继承和多态|isinstance类型判断|溢出|“魔法”方法|语言基础50课:学习记录(6)-函数的高级应用、面向对象编程、进阶及应用
- 蓝桥杯之单片机设计与开发(9)——独立按键实现计时器
- Linux系统三步安装QQ
- C#.NET实现Word或Excel文件转为HTML文件
- 浏览器渲染与浏览器内核相关杂谈
- 【ElasticSearch】什么是ES?ES的安装
- 专家称HTML5使浏览器成为移动互联网主要入口
- 基于昇腾AI,空天院携手华为共同发布全球首个面向跨模态遥感数据的生成式大模型“空天.灵眸”
- tree是不是动词_动名词和不定式入门习题(三)