web-dev-qa-db-fra.com

L'événement chargé d'un contrôle utilisateur WPF se déclenche plusieurs fois

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.

35
Muhammad Akhtar

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 .

43
CodeNaked

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;
        /// ...
    }
};
18
Glenn Slayden

Définissez un indicateur loaded dans l'événement et, si l'indicateur a déjà été défini, ne faites rien.

2
SLaks