alternativa a memorizzando un flag booleano, è possibile utilizzare un metodo di estensione e delegare il wrapping per falsificare Loaded
sparando una volta sola.
public static void OnLoadedOnce(
this UserControl control,
RoutedEventHandler onLoaded)
{
if (control == null || onLoaded == null)
{
throw new ArgumentNullException();
}
RoutedEventHandler wrappedOnLoaded = null;
wrappedOnLoaded = delegate(object sender, RoutedEventArgs e)
{
control.Loaded -= wrappedOnLoaded;
onLoaded(sender, e);
};
control.Loaded += wrappedOnLoaded;
}
...
class MyControl : UserControl
{
public MyControl()
{
InitializeComponent();
this.OnLoadedOnce(this.OnControlLoaded /* or delegate {...} */);
}
private void OnControlLoaded(object sender, RoutedEventArgs e)
{
}
}
Beh, questo è stupido, non dovrei usare clausole di guardia del genere. Ma è la risposta giusta quindi ecco il tuo punto. –
Concordato: è possibile creare una propria classe di finestra che eredita dalla finestra e implementare un evento nell'intero progetto se si tratta di qualcosa che si fa frequentemente. – brendan
Si veda anche questo: http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx –