C#事件处理方法

时间:2015-09-14 00:00:36

标签: c# event-handling

由于我已经开始学习C#,我已经看到了几种处理事件的方法。假设我有一个像这样的XAML按钮:

<Button x:Name="button" Content="Click me!"/>

有了这个按钮,我可以通过多种方式连接点击事件:

  1. 修改按钮的Click属性以指向后面代码中的方法,如:

    <Button x:Name="button" Content="Click me!" Click="button_Click"/>
    

    然后将button_Click方法添加到代码中:

    private void button_Click(object sender, RoutedEventArgs e)
    {
        button.Content = "Ow >_<";
    }
    
  2. 通过后面代码中的委托处理事件:

    button.Click += delegate 
    {
        button.Content = "Ow >_<";
    };
    
  3. 通过后面代码中的lambda表达式处理事件:

    button.Click += (object sender, RoutedEventArgs e) =>
    {
        button.Content = "Ow >_<";
    };
    
  4. 鉴于这三种方法,我有几个问题:

    • 这些方法之间的根本区别是什么。
    • 是否有任何一种方法应该而不是另一种方法。我见过类型1主要用于WPF和WinRT应用程序,但另外两个我在使用Xamarin时才真正看到。

3 个答案:

答案 0 :(得分:2)

  1. 不是特定于WPF或WinRT,在GUI设计器中通常在.NET中单击控件以连接默认事件或单击visual studio的属性窗口中的事件。这是您在大多数时间将事件连接到控件的方式。您通常使用2.或3来连接事件。当您在运行时创建动态控件时,事件本身并没有不同,但是在应用程序的生命周期中创建它们的阶段会对2产生很大的影响。 。和3 ..

答案 1 :(得分:2)

  

这些方法之间的根本区别是什么?

没有根本区别。它们只是向事件注册处理程序的不同方式。

处理事件的另一种方式(以及更易于维护的应用程序的推荐方法)实际上是将视图(GUI)与视图模型(视图背后的逻辑)分开。这称为MVVM模式。 WPF支持数据绑定,这允许您在视图模型类中定义命令,然后您可以将XAML中的按钮附加到此类命令。

请查看this stackoverflow question以获取有关此内容的更多信息。

答案 2 :(得分:1)

从内存泄漏的角度来看,除非您绝对确定这些是一次性事件订阅,否则您将尝试避免方法#2和#3。原因是,您如何取消订阅?

当您编写一个简单的示例代码时,挑战并不容易看到。但是,如果是一个视图模型是一次又一次地动态创建的,基于用户双击列表(或类似的东西),并且这个VM正在将处理程序挂钩到另一个类&#39;事件?当这些VM中的一个或多个超出范围时,您将如何清除事件订阅?典型的订阅删除方式如下:

otherClass.SomeEvent -= myHandler;

但如果您使用匿名代表或lambda,您会怎么做?如果你以某种方式引入2个或更多带有.NET决定相同签名的lambda,这就变成了一场噩梦。哎呀。