asp.net事件传递及wpf路由代理实例 asp.net,事件传递,wpf路由 事件,传递 一篇关于.net事件传递及wpf路由代理实例程序代码,作者写得非常的详细,有需要了解事件传递及wpf路由代理的朋友不防进入参考参考。
这几天做的wpf项目,涉及到弹出窗口更新父级ui,同时弹出窗口需要处理一定的逻辑后调用父级窗口的函数继续执行。
这里就用到了.net事件传递、ui事件更新、wpf的路由事件。
1、什么是.net事件传递(事件链)
在.NET程序设计时,常常将一些辅助类的事件封装绑定到一个容器类(下面假定为ClassA类)中。于是,经常碰到所谓事件传递或转移问题:辅助类ClassB的事件不直接对客户,而是通过其容器类ClassA发布。下面探讨实现中的两个问题:
事件绑定实现:非构造函数与构造函数中实现的区别
容器类事件链:事件访问器+=重载时添加事件链表
1、事件绑定实现
1)非构造函数中实现
如果与ClassB的事件委托相同,ClassA可以直接+=绑定ClassB的事件,然后传递发布出去,见如下代码:
代码如下 | 复制代码 |
public class ClassB // 类 ClassB 通过容器类 ClassA 发布事件 |
2)构造函数中实现存在的问题
如果在ClassA的构造函数中绑定事件,由于类对象没有完成构建,对象仍然是null,此时绑定事件将存在问题。参考如下ClassA代码:
代码如下 | 复制代码 |
public class ClassA { public event EventHandler ClassAEvent; private ClassB classB; public ClassA() // 在构造函数中绑定事件 { classB = new ClassB(); classB.ClassBEvent += new EventHandler(ClassAEvent); // 类对象仍然是null } public void Fire() { classB.Fire(); } } |
上述代码运行时将抛出异常信息“未处理的异常: System.ArgumentException: 实例方法的委托不能具有空this。”显然,该信息表明当前类对象仍然是null(即this是null),不能作为创建委托对象的参数。
特别注意:如果采用所谓委托推断方式,即不用 new EventHandler() 建立委托对象,而是直接绑定事件:
classB.ClassBEvent += this.ClassAEvent; // 委托推断方式
此时,既不会抛出异常,也不会调用(响应)ClassA的事件注册方法,也就是说上述方法失效了!
3) 构造函数中实现的解决方法
如果要在ClassA的构造函数中绑定事件,则可以写一个符合事件委托的方法,然后+=该方法即可,代码如下:
代码如下 | 复制代码 |
public ClassA() // ClassA 的构造函数 { classB = new ClassB(); classB.ClassBEvent += OnClassAEvent; // 绑定到一个方法 } private void OnClassAEvent(object sender, EventArgs e) // 符合委托的方法 { if (this.ClassAEvent != null) { this.ClassAEvent(sender, e); } } |
2、WPF的路由事件实现代码:
1)、使用代理
在子窗口定义代理:
代码如下 | 复制代码 |
public delegate void AddAddEventHandler(); |
弹出窗口的调用:
代码如下 | 复制代码 |
private void Button_Click_1(object sender, RoutedEventArgs e) { try { if (SelectedInvestGUID.Count == 0) { MessageBox.Show("至少要选择一个对象。"); return; } if (AddAddEventEvent != null) { AddAddEventEvent(); } } catch (Exception ex) { MessageBox.Show("出错了"+ex); } } |
父级窗口的事件链:
代码如下 | 复制代码 |
AddEvent edit;//这是弹出窗口 edit = new AddEvent(); edit.eventype = 3; edit.AddAddEventEvent += edit_AddAddEventEvent; |
2)、wpf路由事件:
代码如下 | 复制代码 |
在子窗口声明: public event Action 子窗口调用: private void btndetail_Click(object sender, RoutedEventArgs e) card.DetailMouseLeftUpDelegate += card_DetailMouseLeftUpDelegate; |
注意:代码为项目截取代码。不一定能编译通过。可自行修改一下