2010-07-21 6 views
19

Voglio eseguire del codice quando viene visualizzata per la prima volta Finestra o Controllo. Non posso usare Loaded perché può sparare più di una volta. Non posso usare Initialized perché questo è fatto dal costruttore.WPF: Cosa c'è tra l'evento Initialized e Loaded?

C'è un evento da qualche parte tra?

risposta

29

Sfortunatamente non esiste un evento del genere. È possibile utilizzare un valore booleano nel metodo Loaded per assicurarsi che la roba spara solo una volta -

if(!IsSetUp) 
{ 
    MySetUpFunction(); 
    IsSetUp = true; 
} 

Scopri gli eventi di durata WPF finestre qui:

http://msdn.microsoft.com/en-us/library/ms748948.aspx#Window_Lifetime_Events

alt text http://i.msdn.microsoft.com/dynimg/IC155674.png

+6

Beh, questo è stupido, non dovrei usare clausole di guardia del genere. Ma è la risposta giusta quindi ecco il tuo punto. –

+1

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

+2

Si veda anche questo: http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx –

5

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) 
    { 
    } 
} 
Problemi correlati