首页 > 后端开发 > C++ > 如何在 C# 中的控件之间传输事件处理程序?

如何在 C# 中的控件之间传输事件处理程序?

Linda Hamilton
发布: 2025-01-02 14:51:38
原创
676 人浏览过

How Can I Transfer an Event Handler Between Controls in C#?

你能偷偷地“窃取”事件处理程序吗?

在编码困境中,你试图将事件处理程序从一个控件传输到另一个控件。然而,编译器却是一道难以逾越的障碍。

代码难题:

Button btn1 = new Button();
btn1.Click += new EventHandler(btn1_Click);
Button btn2 = new Button();
// Assign btn1's event to btn2 (but met with rejection from compiler)
btn2.Click += btn1.Click; // Compiler denies
登录后复制

可能的盗窃技术:

  • 直接接送:唉,这种看似简单的方法会引发严厉的编译器反驳。
  • 处理程序复制:复制事件处理程序并将其分配给多个控件是可行的。然而,在这种情况下,这并不是受欢迎的解决方案。

基于反射的技巧:

如果暴力不是你的风格,那么披上反射的外衣可能会揭开一条隐秘的道路。

using System.Reflection;

// Declare event key
FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);

// Retrieve click event
PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);

EventHandlerList events1 = (EventHandlerList)eventsProp.GetValue(btn1, null);
Delegate click = events1[eventClick.GetValue(null)];

// Remove from btn1, assign to btn2
events1.RemoveHandler(eventClick.GetValue(null), click);
EventHandlerList events2 = (EventHandlerList)eventsProp.GetValue(btn2, null);
events2.AddHandler(eventClick.GetValue(null), click);
登录后复制

请注意,微软已经建立了强大的障碍来防止这种行为。但对于那些敢于尝试的人来说,这种运用反射的技术可以让他们进入事件处理的隐藏领域!

以上是如何在 C# 中的控件之间传输事件处理程序?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板