加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

基本的GUI事件处理问题C#

发布时间:2020-12-16 00:15:11 所属栏目:百科 来源:网络整理
导读:下午好, 我有一些关于GUI事件处理的基本问题.首先使用C#,我们如何将事件链接到对象 – 我猜测事件处理程序?如果是这样,每个处理程序可以使用单独 – 事件处理程序如何定位它必须操作的对象? 我对JAVA中的工作原理有一个大概的了解.指向我的参考将是好的 –
下午好,

我有一些关于GUI事件处理的基本问题.首先使用C#,我们如何将事件链接到对象 – 我猜测事件处理程序?如果是这样,每个处理程序可以使用单独 – 事件处理程序如何定位它必须操作的对象?

我对JAVA中的工作原理有一个大概的了解.指向我的参考将是好的 – 我已经搜索谷歌的答案无济于事.

非常感谢,
?

解决方法

Firstly with C# how can we link events
to objects – I am guessing event
handlers? If so can each handler use
separate code?

是的,每个事件处理程序都有自己的代码:

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"); };
    }
}

How can the event handler locate the
objects it must manipulate?

我将过多地简化这一点,但事件处理程序本质上是围绕观察者模式的包装器.与任何其他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 /删除方法也有很多线程伏都教.)

由于委托实例拥有对每个订阅者的引用,因此它可以直接访问它操作的任何对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读