2012-02-10 70 views
12

我有一個非常有趣的任務,我需要幫助。描述如下:如何從用戶控件激發自定義事件?

我有一個用戶控件(SomeUserControl),我在主窗口中使用。我完全在SomeUserControl上編寫我的應用程序,並且主窗口託管SomeUserControl,沒有別的。

現在我有一個關機按鈕(在SomeUserControl中),應該關閉主窗口。原因是我不希望SomeUserControl中的任何東西關閉應用程序本身,而是從SomeUserControl中觸發事件,並且主窗口接收它,並且主窗口將關閉應用程序而不是SomeUserControl。

我該怎麼做?我不熟悉創建和處理自定義事件的概念,所以如果有人能夠用文字和代碼來解釋它,我將非常感謝你!

編輯:這是我的代碼到目前爲止。

(在窗口2)

Public Event CloseApp As EventHandler

Private Sub CancelButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles CancelButton.Click 
    DialogResult = False 
    RaiseEvent CloseApp(Me, New EventArgs) 
End Sub 

(在主窗口) 公共loginPage作爲新LoginPage

Public Sub New() 
    InitializeComponent() 
    AddHandler loginPage.CloseApp, AddressOf Me.ShutDownJobChangeWindow 
End Sub 

Private Sub ShutDownJobChangeWindow(ByVal sender As Object, ByVal e As EventArgs) 
    Application.Current.Shutdown() 
End Sub 

目標:我要關閉應用程序,當我點擊取消在窗口2中,但我不想這樣做,窗戶2自己關閉,但通過發送一些通知到主窗口,主要窗口關閉應用程序。

回答

14

如果用戶控件的邏輯在用戶控件類的「後面的代碼」中實現,請執行以下操作。

我一個點擊事件假設XAML文件的某處一個按鈕:

<Button Click="Button_Click">Close App</Button> 

然後,在後面的代碼爲SomeUserControl類,請執行以下操作:

public partial class SomeUserControl : UserControl 
{ 
    public event EventHandler CloseApp; 

    ... 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     if(CloseApp != null) { 
      CloseApp(this, new EventArgs()); 
     } 
    } 
} 

在你主窗口,聽取事件:

... 

someUserCtrl.CloseApp += new EventHandler(MyFn); 

private void MyFn(object sender, object EventArgs e) { 
    ... 
} 
+0

就像AkselK提供的解決方案一樣,我如何在VB中做到這一點?尤其是If(CloseApp!= null)中的部分。因爲intellisense無法找到CloseApp。 - will0809 20分鐘前 – will0809 2012-02-10 11:16:32

+0

我有同樣的問題,但我使用MVVM,所以我不能使用這個: - someUserCtrl.CloseApp + = new EventHandler(MyFn); 相反,我使用MVVM Light庫,並將事件觸發器添加到我的MainWindow中,如< /i:Interaction.Triggers> 但它不起作用。 – 2014-01-08 09:42:53

1

要做到這一點,最簡單的方法是聲明自定義事件:

public delegate void ShutdownEventHandler (object sender, EventArgs data); 
public event ShutdownEventHandler Shutdown; 
protected void OnShutdown(EventArgs args) 
{ 
    if(Shutdown != null) 
     Shutdown(this, args); 
} 

然後您訂閱在主窗口的關閉事件,並處理關閉邏輯存在。 而在SomeUserControl中,只需在關閉應用程序時運行OnShutdown。

+1

我這個轉換爲VB爲那些誰需要它。 '公共委託子ShutdownEventHandler(發送者爲對象,E作爲EventArgs的) 公共事件ShutItDown作爲ShutdownEventHandler' '公共事件ShutItDown作爲ShutdownEventHandler' ,但我不是太肯定的第三部分。 Intellisense無法識別If語句中的「ShutItDown」。 – will0809 2012-02-10 10:44:16

+0

另外,我將閱讀如何訂閱關機事件,因爲我不知道如何。如果你能快速解釋它,那將會很棒。 – will0809 2012-02-10 10:47:01

+1

這裏沒有必要定義'ShutdownEventHandler',因爲它與'System.EventHandler'完全相同。事件聲明可以簡單地寫爲「公共事件EventHandler Shutdown;'。 – Clemens 2012-02-10 10:58:24