2015-09-14 87 views
1

自从我开始学习C#以来,我已经看到了一些处理事件的方法。说我有一个像这样的XAML按钮:C#事件处理方法

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

鉴于此按钮,我可以在几个方面挂钩click事件:

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

鉴于这三个方法,我有几个问题:

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

回答

1

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

当你编写一个简单的示例代码时,挑战并不容易看到。但是如果它是一个反复动态创建的视图模型,基于用户双击列表(或类似的东西),而这个虚拟机将一个处理程序挂钩到另一个类的事件呢?当这些VM中的一个或多个超出范围时,您将如何清除事件订阅?一个典型的订阅去除看起来像:

otherClass.SomeEvent -= myHandler; 

但你会怎么做,如果你使用的是匿名委托或拉姆达?如果您以某种方式引入2个或更多带有.NET所定义的签名的lambda表达式,这将变成一场噩梦。哎呀。

2
  1. 不特定于WPF或WinRT的,它是在GUI设计.NET典型的点击控件线了违约事件或单击在Visual Studio的属性窗口中的事件。这就是大部分时间你要将事件连接到控件的方式。在运行时创建动态控件时,通常使用2或3连接事件,事件本身并没有不同,但在应用程序的生命周期中创建它们的阶段对于2 。和3 ..
2

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

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

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

查看this stackoverflow question了解更多关于此的信息。

+0

您提到了WPF,但是WinRT Universal应用程序中可以使用相同的MVVM模式吗? –

+1

我从来没有使用过Universal Apps,但快速的谷歌搜索显示了一些如何做到这一点的例子。 –