2009-02-19 16 views

Respuesta

40

que se oye. También me falta una solución lista para usar en WPF para esto.

A veces desea que se ejecute algún código después de cargar todos los controles secundarios.

Pon esto en el constructor del control de los padres

Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => {code that should be executed after all children are loaded})); 

me ayudó un par de veces hasta ahora.

+1

Funciona como un encanto. ¡Gracias! –

+0

no funciona para mí ... las instalaciones de dep todavía son nulas – user1034912

10

Loaded es el evento que se activa después de que todos los niños hayan sido Initialized. No hay ningún evento AfterLoad por lo que sé. Si puede, mueva la lógica de los niños al evento Initialized, y luego Loaded se producirá después de que todos hayan sido inicializados.

Ver MSDN - Object Lifetime Events.

+5

¿Cómo puede una respuesta tener 7 votos ascendentes, si es incorrecto? La respuesta de Buckly, con solo 2 upvotes, funciona perfectamente. –

+0

@FrederikPrijck El hecho de que una respuesta sea correcta no significa que otra no lo sea. Esta respuesta * es * correcta, es útil y es exactamente lo que necesitaba: estaba haciendo algo en el controlador Cargado del niño de lo que debería haberse hecho en su controlador Inicializado. Y, de hecho, la respuesta de Buckley, que dice "perder una solución lista para usar en WPF para esto", está de acuerdo con esta respuesta. Y vea la respuesta de Jobi, que sugiere que hay casos en los que el truco de Buckey no será adecuado. –

+0

¿Dónde estoy diciendo que solo una respuesta puede ser correcta? Esta respuesta no funcionó para mí, pero eso es algo totalmente diferente de quedarse solo con una respuesta que puede ser correcta. Pero ha pasado un tiempo, así que no sé los detalles. –

0

WPF no puede proporcionar ese tipo de evento ya que la mayoría de las veces de datos es determinar whther para cargar un niño en particular a la VisualTree o no (por ejemplo, elementos de interfaz de usuario dentro de un DataTemplate)

Así que si usted puede explicar su escenario poco más claro que podemos encontrar una solución específica para eso.

-1

Terminé haciendo algo en esta línea ... su kilometraje puede variar.

void WaitForTheKids(Action OnLoaded) 
{ 
    // After your children have been added just wait for the Loaded 
    // event to fire for all of them, then call the OnLoaded delegate 

    foreach (ContentControl child in Canvas.Children) 
    { 
    child.Tag = OnLoaded; // Called after children have loaded 
    child.Loaded += new RoutedEventHandler(child_Loaded); 
    } 
} 
internal void child_Loaded(object sender, RoutedEventArgs e) 
{ 
    var cc = sender as ContentControl; 
    cc.Loaded -= new RoutedEventHandler(child_Loaded); 

    foreach (ContentControl ctl in Canvas.Children) 
    { 
    if (!ctl.IsLoaded) 
    { 
     return; 
    } 
    } 
    ((Action)cc.Tag)(); 
} 
0

Tuve el mismo problema. @configurator tiene razón, si tiene este problema, creo que es porque tiene un problema con los elementos secundarios. En mi caso, los elementos secundarios donde un usuario personalizado controla. Los estaba inicializando incorrectamente. Arreglé el control del usuario y todo funcionó muy bien

0

Una de las opciones (cuando el contenido prestados):

this.LayoutUpdated + = OnLayoutUpdated;

private void OnLayoutUpdated(object sender, EventArgs e) 
      { 
       if (!isInitialized && this.ActualWidth != 0 && this.ActualHeight != 0) 
       { 
        isInitialized = true; 
        // Logic here 
       } 
      }; 
Cuestiones relacionadas