2013-01-23 6 views
12

Ho un UserControl in WPF:Come al fuoco evento Unload di Usercontrol in una finestra WPF

<UserControl x:Class="XLogin.DBLogin" 
      x:Name="DBLoginUserFrame" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      Height="263" 
      Width="353" 
      Loaded="DBLoginUserFrame_Loaded" 
      Unloaded="DBLoginUserFrame_Unloaded"> 
    <Grid> 
    <GroupBox Header="Database Connection" 
       HorizontalAlignment="Left" 
       Height="243" 
       Margin="10,10,0,0" 
       VerticalAlignment="Top" 
       Width="333"> 
     <Grid> 
     <TextBox x:Name="TextUserDB" 
       HorizontalAlignment="Left" 
       Height="20" 
       Margin="101,60,0,0" 
       TextWrapping="Wrap" 
       VerticalAlignment="Top" 
       Width="173" /> 
     <Label Content="Password:" 
       HorizontalAlignment="Left" 
       Height="24" 
       VerticalAlignment="Top" 
       Width="70" 
       HorizontalContentAlignment="Right" 
       Margin="10,85,0,0" /> 
     <PasswordBox x:Name="TextPasswordDB" 
        HorizontalAlignment="Left" 
        Height="20" 
        Margin="101,89,0,0" 
        VerticalAlignment="Top" 
        Width="173" /> 
     <Button x:Name="BtnConnect" 
       Content="Connetti" 
       Height="29" 
       Width="123" 
       Margin="101,152,97,24" 
       Click="BtnConnect_Click" /> 
     </Grid> 
    </GroupBox> 

    </Grid> 
</UserControl> 

Quando ho Unload questo controllo, WPF alzare evento DBLoginUserFrame_Unloaded che salvare le mie impostazioni e fa un lavoro.

Ho la MainWindow in WPF che caricare questo controllo utente, ma quando la finestra è chiusa, il mio UserControl SCARICO non lo fa fuoco:

<Window x:Class="XLogin.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" 
    xmlns:local="clr-namespace:XLogin" Unloaded="Window_Unloaded_1"> 
<Grid> 
    <local:DBLogin/> 
</Grid></Window> 

Come aggiungere l'evento UserControl Unload per MainWindow gestore di eventi?

risposta

14

Dal documentation:

"Si noti che l'evento a vuoto non viene generato dopo un applicazione inizia l'arresto l'arresto di applicazione si verifica quando si verifica la condizione definita dalla proprietà ShutdownMode Se si inserisce il codice di pulitura all'interno di un gestore.. per l'evento Unloaded, ad esempio per Window o UserControl, non può essere chiamato come previsto. "

Se chiudere la finestra provoca l'arresto dell'applicazione, questa potrebbe essere la causa. In tal caso, anche l'evento Unload di Windows potrebbe non essere chiamato così, quindi credo che sia meglio fare affidamento sull'evento Window.Closing.

Un approccio per gestire le attività eseguite dall'utente UserControl quando scaricato rappresenta il metodo del gestore di scaricamento del controllo ("DBLoginUserFrame_Unloaded"), denominare l'istanza UserControl in MainWindow e richiamarlo dall'evento Window.Closing.

public MainWindow() 
{ 
    // Add this 
    this.Closing += MainWindow_Closing; 
} 

void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    this.MyUserControl.MethodToBeCalledWhenUnloaded(). 
} 

Un'altra opzione è quella di mantenere la realizzazione finora, ma anche aggiungere nel vostro UserControl un gestore per l'evento Dispatcher.ShutdownStarted, come descritto here.

public MyUserControl() 
{ 
    this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; 
}