2015-09-14 94 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,但快速的谷歌搜索顯示了一些如何做到這一點的例子。 –