2012-03-13 9 views
5

Estoy cargando controles de usuario en una grilla específica en nuestra aplicación y estoy agregando animaciones a los controles de usuario de carga en el controlador de eventos Loaded de los controles.¿Hay algún evento después de Loaded y antes de mostrar el control del usuario?

Algunos de los controles de usuario son livianos y algunos de ellos requieren cálculos pesados ​​antes de la carga. El problema es que cuando agrego una animación de 1 segundo a los controles pesados ​​del usuario, ¡entonces, al mostrar el control, la animación no se puede ver nunca!

¿Hay algún otro evento que pueda agregar mi animación al control del usuario para que los pesados ​​y los ligeros se muestren con la misma animación?

Necesito un evento justo antes de mostrar el control. OnLoaded no parece ser el lugar correcto para mí, desafortunadamente.

Respuesta

5

La respuesta estaba dando una prioridad más baja es la Storyboard.Begin.

me di cuenta que a partir de esta respuesta: https://stackoverflow.com/a/4708172/970420

Así que tenemos el código para el comienzo de la animación:

void BeginStoryboardAction(Storyboard sb) 
    { 
     sb.Begin(); 
    } 

y deberíamos llamarlo de esta manera:

Dispatcher.BeginInvoke(new Action<Storyboard>(BeginStoryboardAction), DispatcherPriority.ContextIdle, sb); 

sb es una instancia de Storyboard que tiene algunas animaciones.

[Editar]: Otra forma más corta:

Dispatcher.BeginInvoke(new Action<Storyboard>(delegate (Storyboard stb){stb.Begin();}), DispatcherPriority.ContextIdle, sb); 
3

Cuando se abre por primera vez una ventana, los eventos Cargados y ContentRendered se generan solo después de que se active el evento Activated. Con esto en mente, una ventana se puede considerar efectivamente abierta cuando se genera ContentRendered.

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

+2

Gracias a Aksel por su atención, pero probé ContentRendered para la ventana del contenedor y solo se dispara una vez en el inicio y nunca me vuelven a disparar. Sin embargo, llegué a la solución :) La solución reside aquí: http://stackoverflow.com/a/4708172/970420, ya que Rick dijo que deberíamos programar el inicio del guión para que tenga la prioridad más baja. Así que agregué 'void BeginStoryboardAction() {sb.Begin(); } 'y llamadas diferidas a él de esta manera:' Dispatcher.BeginInvoke (nueva Acción (BeginStoryboardAction), DispatcherPriority.ContextIdle); 'funciona como un amuleto incluso para los controles de usuario de carga pesada :) –

0

Para aquellos que están buscando una manera genérica para ejecutar código justo después de que se creen los componentes, pero antes de que se presten caso LayoutUpdated ayuda. Esto debería funcionar dentro de las ventanas, así como dentro de los controles de usuario o personalizados.

Cuestiones relacionadas