2010-07-21 5 views

Respuesta

29

Lamentablemente no hay tal evento. Se puede utilizar un valor lógico en el Método Cargado para asegurarse de que sus cosas sólo se activa una vez -

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

Salida los eventos de toda la vida WPF de Windows aquí:

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

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

+6

Bueno, eso es estúpido, no debería tener que usar cláusulas de guardia como esa. Pero es la respuesta correcta, así que este es tu punto. –

+1

De acuerdo: podría crear su propia clase de ventana heredando desde la ventana e implementar un evento en todo su proyecto si es algo que hace con frecuencia. – brendan

+2

También vea esto: http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx –

5

Como alternativa a Al almacenar un indicador booleano, puede usar un método de extensión y delegar el ajuste a falso Loaded disparando solo una vez.

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) 
    { 
    } 
} 
Cuestiones relacionadas