Pour implémenter un environnement basé sur des onglets dans WPF nous devons convertir nos formulaires en contrôles utilisateur, cependant en faisant cela, l'événement Loaded
de le contrôle utilisateur est appelé deux fois .
Lors d'une recherche sur Internet, d'autres personnes ont également signalé ce problème. Comment pouvons-nous nous assurer que l'événement chargé n'est appelé qu'une seule fois? Parce que lorsqu'elle est appelée plusieurs fois, l'initialisation de nos contrôles se produit plusieurs fois.
Comme expliqué dans ce blog , l'événement Loaded est déclenché chaque fois qu'un contrôle est sur le point d'être rendu (c'est-à-dire ajouté à l'arborescence visuelle).
Plusieurs contrôles peuvent entraîner le chargement/déchargement de votre contrôle plusieurs fois. Par exemple, le WPF TabControl natif ne rend que le contenu de l'onglet sélectionné. Ainsi, lorsque vous sélectionnez un nouvel onglet, le contenu de l'onglet précédemment sélectionné est déchargé. Si vous cliquez de nouveau sur l'onglet précédemment sélectionné, son contenu est rechargé.
Une solution consiste à utiliser un booléen pour indiquer si vous avez déjà initialisé votre contrôle, comme suggéré par d'autres. Vous pouvez également utiliser à la place l'événement Initialized .
Votre gestionnaire d'événements routé peut (et devrait) se retirer du crochet Loaded
comme première chose.
public class MyClass : Window
{
public MyClass()
{
Loaded += MyLoadedRoutedEventHandler;
}
void MyLoadedRoutedEventHandler(Object sender, RoutedEventArgs e)
{
Loaded -= MyLoadedRoutedEventHandler;
/// ...
}
};
Définissez un indicateur loaded
dans l'événement et, si l'indicateur a déjà été défini, ne faites rien.