Après avoir écrit un commentaire au poste de Zane, une après pensée est venue à moi: en fait, vous ne voulez pas utiliser cette solution avec le drapeau booléen, ou vous devez le rendre encore plus robuste.
Il est admis qu'un contrôle peut être RÉUTILISÉ. Cela signifie que le contrôle peut être ajouté à l'arborescence, puis supprimé, ajouté, supprimé et ainsi de suite. Si vous avez vraiment besoin de filtrer les invocations multiples de Loaded, vous devez également suivre l'événement Unloaded!
Suivant l'exemple de Zane, il devrait ressembler à code suivant:
using System.Windows;
using System.Windows.Controls;
public class LoadOnceUserControl : UserControl
{
private bool firstLoadCalled = false;
public LoadOnceUserControl()
{
this.Unloaded += (sender,e) => firstLoadCalled = false;
this.Loaded += (sender,e) =>
{
if (this.firstLoadCalled) return;
this.firstLoadCalled = true;
var copy = this.FirstLoaded;
if (copy != null) copy(sender,e);
});
}
/*public*/ event RoutedEventHandler FirstLoaded;
}
S'il vous plaît noter qu'il pourrait être raisonnable aussi ajouter FirstUnloaded analogue juste pour la symétrie. Je ne l'ai jamais vu appeler faussement bien. Et l'esprit que, malgré waht je l'ai écrit dans le commentaire à Zane - dans cette approche, vous ne doit pas détacher que les gestionnaires
zane - c'est très gentil de votre part que vous vouliez partager tout le monde avec cette utilité, mais la prochaine fois que vous sentirez cette envie, s'il vous plaît faites-en un peu hm .. robuste. ce code semble simple, mais il a plusieurs défauts de conception qui ne peuvent que coûter plus aux utilisateurs, ne donnant rien à leur tour. Au moins deux choses sont perceptibles à première vue, et je veux vraiment dire premier coup d'œil, pas d'analyse plus profonde! La première est que vous n'invoquez pas l'événement en toute sécurité/correctement. Deuxièmement, il n'y a AUCUN intérêt à ce qu'un tel gestionnaire anonyme soit encore attaché après la détection de la deuxième invocation. – quetzalcoatl