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

时间:2010-12-21 14:50:47

标签: c# events user-interface event-handling

下午好,

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

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

非常感谢, Ĵ

4 个答案:

答案 0 :(得分:5)

  

首先使用C#我们如何链接事件   对象 - 我猜测事件   处理程序?如果是这样,每个处理程序都可   单独的代码?

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

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,其中添加了处理程序而不是改变处理程序。我相信他们的添加/删除方法也有很多线程伏都教。)

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

答案 1 :(得分:3)

在Visual Studio中使用设计器,您可以轻松使用GUI对象处理程序。通过单击“闪电”按钮,您将看到所有可用的事件以进行细节控制。通过在所选事件上单击两次,IDE将为您生成方法存根。

    private void button_Click(object sender, EventArgs e)
    {
        //sender is the object which actually raised the event
        ((Button)sender).Text = "Clicked Me";
    }

事件处理程序像这样添加(在* .Designer.cs文件中自动完成)

    button.Click += new System.EventHandler(this.button_Click);

答案 2 :(得分:3)

每个事件实际上都是一个委托 - 您使用此表示法向此委托注册事件处理程序:

myButton.Click += new EventHandler(myEventHandler);

这样,当按钮单击事件触发时,其调用列表上的任何事件处理程序(在这种情况下,这将包括myEventHandler函数。

对于每个按钮,您都会执行相同操作并注册要触发的事件处理程序(对于多个按钮,可以是相同的事件处理程序)。

也许这个MSDN话题会有所启发:Events and Delegates

答案 3 :(得分:2)

这取决于您使用的UI库。在WPF中,您在XAML中定义事件处理程序:

<Button Click="HelloWorldClickEventHandler">Hello World</Button>

// this is in your .cs code file
private void HelloWorldClickEventHandler(object sender, RoutedEventArgs e)
{
    // some code
}

在WinForms中,您可以在表单的构造函数中附加处理程序:

public MyForm() {
    // ...
    HelloWorldButton.Click += new EventHandler(HelloWorldClickEventHandler);
}

private void HelloWorldClickEventHandler(object sender, EventArgs e)
{
    // some code
}

当然,使用像Visual Studio这样的IDE可以简化这个过程。

  

事件处理程序如何定位必须操作的对象?

有两种方法可以访问相关对象:

  • 由于这些方法是窗口(WPF)或窗体(WinForms)的实例方法,因此它们可以直接访问所有UI资源(即,您可以在代码中使用this.MyLabel)。

  • 第一个参数sender按惯例是引发事件的UI控件。如果您为多个UI控件使用一个事件处理程序,这将非常有用。