基本的GUI事件处理问题C#
下午好,
我有一些关于GUI事件处理的基本问题.首先使用C#,我们如何将事件链接到对象 – 我猜测事件处理程序?如果是这样,每个处理程序可以使用单独 – 事件处理程序如何定位它必须操作的对象? 我对JAVA中的工作原理有一个大概的了解.指向我的参考将是好的 – 我已经搜索谷歌的答案无济于事. 非常感谢, 解决方法
是的,每个事件处理程序都有自己的代码: class A { public event EventHandler SomeEvent; } class B { public B(A a) { a.SomeEvent += (sender,e) => { Console.WriteLine("B's handler"); }; } } class C { public C(A a) { a.SomeEvent += (sender,e) => { Console.WriteLine("C's handler"); }; } }
我将过多地简化这一点,但事件处理程序本质上是围绕观察者模式的包装器.与任何其他Delegate类型一样的EventHandlers在方法调用列表中保存订阅者列表(参见Delegate.GetInvocationList).你可以这样想: class EventHandler { LinkedList<Action<object,EventArgs>> subscribers = new LinkedList<Action<object,EventArgs>>(); public void Add(Action<object,EventArgs> f) { subscribers.AddLast(f); } public void Remove(Action<object,EventArgs> f) { subscribers.Remove(f); } public void Invoke(object sender,EventArgs e) { foreach(Action<object,EventArgs> f in subscribers) f(sender,e); } } (上面的代码与真实事件处理程序类的实际实现细节相去甚远.委托类型是不可变的,因此添加一个处理程序返回一个新的Delegate,添加了处理程序而不是改变处理程序.我相信他们的Add /删除方法也有很多线程伏都教.) 由于委托实例拥有对每个订阅者的引用,因此它可以直接访问它操作的任何对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby – 如何使用FactoryBot定义嵌套工厂?
- IBM GBS 独家斩获Oracle应用产品“年度合作伙伴”大奖!
- 浅析postgresql数据库事务及行锁特征
- PostgreSQL索引优化案例分析
- how to make Completion Handlers and use it in Swift
- ruby-on-rails – nginx:[emerg]一个重复的默认服务器
- 关于sqlite3使用top的一些规则总结
- 构建过程 – Makefile生成器:premake vs bakefile?
- XML(3)——认识Schema
- 深度学习论文理解3:Flexible, high performance convoluti