2012-02-10 3 views
12

Ho un compito molto interessante con il quale ho bisogno di aiuto. La descrizione è la seguente:Come si attiva un evento personalizzato da un controllo utente?

Ho un controllo utente (SomeUserControl), che sto utilizzando in una finestra principale. Scrivo la mia applicazione interamente su SomeUserControl e la finestra principale ospita SomeUserControl e nient'altro.

In questo momento ho un pulsante di arresto (in SomeUserControl), che dovrebbe chiudere la finestra principale. La ragione di ciò è che non voglio nulla da SomeUserControl per chiudere l'applicazione stessa, ma per attivare un evento da SomeUserControl, e la finestra principale lo riceve, e la finestra principale chiuderà l'applicazione invece di SomeUserControl.

Come faccio? Non ho familiarità con il concetto di creare e gestire eventi personalizzati, quindi se qualcuno potrebbe spiegarlo a parole e in codice come esempio, ti sarò molto grato!

Modifica: ecco il mio codice finora.

(in finestra 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 

(nella finestra principale) pubblico loginPage come nuovo 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 

Obiettivo: Voglio chiudere l'applicazione quando si fa clic cancella in Window 2, ma non voglio farlo in modo tale che Window 2 si chiuda da solo, ma inviando alcune notifiche alla finestra principale, e Main La finestra chiude l'applicazione.

risposta

14

Se la logica del controllo utente è implementata nel "codice dietro" della classe di controllo utente, effettuare le seguenti operazioni.

Sto assumendo il file XAML ha posto un pulsante con un evento click:

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

Poi, nel codice dietro per la classe SomeUserControl, effettuare le seguenti operazioni:

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

    ... 

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

Nella tua finestra principale, ascoltare l'evento:

... 

someUserCtrl.CloseApp += new EventHandler(MyFn); 

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

come la soluzione fornita da AkselK, come posso farlo in VB? specialmente la parte in If (CloseApp! = null). Perché intellisense non riesce a trovare CloseApp. - will0809 20 minuti fa – will0809

+0

Ho la stessa domanda, ma sto usando MVVM, quindi non posso usare questo: - someUserCtrl.CloseApp + = new EventHandler (MyFn); Piuttosto ho usato le librerie MVVM Light e ho aggiunto un trigger di evento alla mia MainWindow come < /i:Interaction.Triggers> Ma non funziona. –

1

Il modo più semplice per farlo è quello di dichiarare un evento personalizzato:

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

Poi si sottoscrive l'evento di arresto in MainWindow, e gestire la logica di arresto lì. E in SomeUserControl, è sufficiente eseguire OnShutdown quando si desidera arrestare l'applicazione.

+1

sto convertendo questo per VB per chi ne ha bisogno. 'delegato Public Sub ShutdownEventHandler (mittente come oggetto, e As EventArgs) Festività pubblica ShutItDown Come ShutdownEventHandler' ' ShutItDown Public Event Come ShutdownEventHandler' ma non sono troppo sicuro circa la terza parte. Intellisense non riconosce "ShutItDown" all'interno dell'istruzione If. – will0809

+0

inoltre, ho intenzione di leggere su come iscriversi all'evento di chiusura, perché non so come. Se riesci a spiegarlo in due tempi rapidi, sarà fantastico. – will0809

+1

Qui non è necessario definire 'ShutdownEventHandler', poiché è identico a' System.EventHandler'. La dichiarazione dell'evento potrebbe semplicemente essere scritta come 'evento pubblico EventHandler Shutdown;'. – Clemens