【问题标题】:C# Event Handling MethodsC# 事件处理方法
【发布时间】:2015-12-09 22:01:23
【问题描述】:

自从我开始学习 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 >_<";
    };
    

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

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

【问题讨论】:

    标签: c# event-handling


    【解决方案1】:
    1. 不特定于 WPF 或 WinRT,在 .NET 中的 GUI 设计器中单击控件以连接默认事件或单击 Visual Studio 属性窗口中的事件是典型的。这就是您在大多数情况下将事件连接到控件的方式。当您在运行时创建动态控件时,通常使用 2. 或 3. 连接事件,事件本身并没有什么不同,但是在应用程序的生命周期中创建它们的阶段对 2 有很大的不同. 和 3..

    【讨论】:

      【解决方案2】:

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

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

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

      查看this stackoverflow question 了解更多信息。

      【讨论】:

      • 您提到了 WPF,但是相同的 MVVM 模式可以在 WinRT 通用应用程序中使用吗?
      • 我从未使用过通用应用程序,但快速的谷歌搜索显示了一些关于如何做到这一点的示例。
      【解决方案3】:

      从内存泄漏的角度来看,您应该尽量避免方法 #2 和 #3,除非您绝对确定这些是一次性事件订阅。原因是,您将如何退订这些?

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

      otherClass.SomeEvent -= myHandler;
      

      但是,如果您使用的是匿名委托或 lambda,您会怎么做呢?如果您以某种方式引入 2 个或多个具有 .NET 认为相等的签名的 lambda,这将成为一场噩梦。啊。

      【讨论】:

        猜你喜欢
        • 2016-07-26
        • 1970-01-01
        • 2016-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        • 1970-01-01
        相关资源
        最近更新 更多