2012-02-10 23 views
12

Tengo una tarea muy interesante con la que necesito ayuda. La descripción es la siguiente:¿Cómo disparo un evento personalizado desde un Control de usuario?

Tengo un control de usuario (SomeUserControl), que estoy usando en una ventana principal. Escribo mi aplicación completamente en SomeUserControl, y Main Window aloja SomeUserControl y nada más.

Ahora tengo un botón de apagado (en SomeUserControl), que se supone que cierra la ventana principal. La razón de esto es que no quiero que nada de SomeUserControl cierre la aplicación en sí, sino que active un evento desde SomeUserControl, y Main Window lo reciba, y la ventana principal cerrará la aplicación en lugar de SomeUserControl.

¿Cómo lo hago? No estoy familiarizado con el concepto de crear y manejar eventos personalizados, por lo que si alguien pudiera explicarlo en palabras y en código como ejemplo, ¡le estaré muy agradecido!

Editar: Aquí está mi código hasta el momento.

(en la ventana 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 

(En la ventana principal) Pública loginPage Como Nueva 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 

Meta: Quiero cerrar la aplicación al hacer clic cancelar en la ventana 2, pero no quiero hacerlo de tal manera que la ventana 2 se cierre solo, pero enviando una notificación a la ventana principal, y principal La ventana cierra la aplicación.

Respuesta

14

Si la lógica del control de usuario se implementa en el "código subyacente" de la clase de control de usuario, haga lo siguiente.

Asumo el archivo XAML ha lugar un botón con un evento de clic:

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

Luego, en su código detrás de la clase SomeUserControl, haga lo siguiente:

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

    ... 

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

En su Ventana principal, escuchar el evento:

... 

someUserCtrl.CloseApp += new EventHandler(MyFn); 

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

como la solución provista por AkselK, ¿cómo lo hago en VB? especialmente la parte en If (CloseApp! = null). Porque intellisense simplemente no puede encontrar CloseApp. - will0809 Hace 20 minutos – will0809

+0

Tengo la misma pregunta, pero estoy usando MVVM, así que no puedo usar esto: - someUserCtrl.CloseApp + = new EventHandler (MyFn); En lugar de eso, utilicé las bibliotecas MVVM Light y agregué un desencadenador de eventos a mi MainWindow como < /i:Interaction.Triggers> Pero no funciona. –

1

La forma más sencilla de hacerlo es declarar un evento personalizado:

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

Luego se suscribe al evento de cierre en MainWindow, y manejar la lógica de parada allí. Y en SomeUserControl, simplemente ejecuta OnShutdown cuando desea cerrar su aplicación.

+1

Estoy convirtiendo esto a VB para aquellos que lo necesitan. 'Public Sub Delegado ShutdownEventHandler (remitente como objeto, e como EventArgs) Evento Público ShutItDown Como ShutdownEventHandler' ' Pública Evento ShutItDown Como ShutdownEventHandler' pero no estoy muy seguro acerca de la tercera parte. Intellisense no reconoce "ShutItDown" dentro de la instrucción If. – will0809

+0

también, voy a leer cómo suscribirse al evento de cierre, porque no sé cómo hacerlo. Si puedes explicarlo en doble tiempo rápido, será genial. – will0809

+1

No es necesario definir 'ShutdownEventHandler' aquí, ya que es idéntico a' System.EventHandler'. La declaración del evento simplemente podría escribirse como 'evento público EventHandler Shutdown;'. – Clemens

Cuestiones relacionadas