web-dev-qa-db-fra.com

Comment déclencher l'événement de déchargement de Usercontrol dans une fenêtre WPF

J'ai un UserControl dans 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>

Lorsque je décharge ce contrôle, l'événement WPF déclenche DBLoginUserFrame_Unloaded qui enregistre mes paramètres et effectue un travail.

J'ai le MainWindow dans WPF qui charge ce contrôle utilisateur, mais lorsque la fenêtre est fermée, mon usercontrol UNLOAD ne se déclenche pas:

<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>

Comment ajouter l'événement UserControl Unload au gestionnaire d'événements MainWindow?

13
davymartu

À partir de documentation :

"Notez que l'événement Unloaded n'est pas déclenché après le démarrage d'une application. L'arrêt de l'application se produit lorsque la condition définie par la propriété ShutdownMode est remplie. Si vous placez du code de nettoyage dans un gestionnaire pour l'événement Unloaded, tel qu'une fenêtre ou un UserControl , il ne peut pas être appelé comme prévu. "

Si la fermeture de votre fenêtre déclenche l'arrêt de votre application, c'est peut-être à cause de cela. Dans ce cas, même l'événement de déchargement de la fenêtre pourrait ne pas être appelé également. Je pense donc qu'il est préférable de s'appuyer sur Window.Closing event. 

Une approche permettant de gérer les tâches effectuées par votre UserControl lors du déchargement consiste à exposer la méthode de gestionnaire de déchargement du contrôle ("DBLoginUserFrame_Unloaded"), à nommer votre instance UserControl dans MainWindow et à l'appeler à partir de l'événement Window.Closing.

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

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

Une autre option consiste à conserver votre implémentation jusqu'à présent mais également à ajouter à votre contrôle UserControl un gestionnaire pour l'événement Dispatcher.ShutdownStarted, comme décrit here .

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

Vous pouvez également mettre la logique dans le contrôle de l'utilisateur lui-même pour le garder un peu plus autonome.

public UserControl1()
{
  InitializeComponent();
  this.Loaded += UserControl1_Loaded;
}

void UserControl1_Loaded(object sender, RoutedEventArgs e)
{
  Window window = Window.GetWindow(this);
  window.Closing += window_Closing;
}

void window_Closing(object sender, global::System.ComponentModel.CancelEventArgs e)
{
 //Save your settings here
}

Vu cela ici: https://social.msdn.Microsoft.com/Forums/vstudio/en-US/477e7e74-ccbf-4498-8ab9-ca2f3b836597/how-to-know-when-a -wpf-usercontrol-is-fermeture? forum = wpf

1
tomasat