2009-10-16 22 views
6

He estado agregando un poco de animación a mi aplicación WPF.WPF - Diseño Evento actualizado que se repite varias veces

Gracias a Dan Crevier's unique solution to animating the children of a panel combinado con awesome WPF Penner animations resultó ser bastante sencillo hacer que uno de mis controles se vea bien y hacer que sus niños se muevan con una buena animación.

Lamentablemente, esto tiene un costo de rendimiento. Me alegra que el rendimiento se vea afectado cuando se agregan/eliminan elementos o se cambia el tamaño del control, pero parece que este golpe de rendimiento se produce de manera constante a lo largo de la vida de la aplicación, incluso cuando los elementos son completamente estáticos.

La clase PanelLayoutAnimator utiliza una propiedad adjunta para enganchar el evento UIElement.LayoutUpdated. Cuando se activa este evento, las transformaciones de render están animadas para hacer que los niños se deslicen a sus nuevas posiciones.

Desafortunadamente parece que el evento LayoutUpdated se dispara cada segundo, incluso cuando no ocurre nada en la aplicación (al menos no creo que mi código esté haciendo nada, la aplicación no tiene foco y el mouse está constante). Como la razón del evento no es inmediatamente aparente para el controlador de eventos, todos los hijos del control deben ser reevaluados. Este evento se llama una vez por segundo cuando está inactivo. La frecuencia aumenta al usar la aplicación.

Así que mi pregunta es, ¿cómo puedo mejorar el rendimiento aquí? Cualquier respuesta que ayuda sería apreciada, pero actualmente estoy atascado en estas sub-preguntas:

  1. Lo que hace que el evento LayoutUpdated al fuego con tanta frecuencia? Se supone que esto sucederá, y si no, ¿cómo puedo averiguar por qué está disparando y acortarlo?

  2. ¿Hay alguna manera más conveniente dentro del controlador para saber si algo ha sucedido que podría haber movido a los niños? Si es así, podría rescatarme temprano y evitar el exceso de bucle de cada niño.

Por ahora voy a solucionar este problema mediante la desactivación de animación cuando hay más de N niños en el panel.

+0

Drew, ¿podría compartir pequeño ejemplo de código que podría reproducir el problema? – Anvaka

+0

Sí, porque LayoutUpdated solo debería activarse realmente si algo está causando que el diseño se actualice ... por más obvio que parezca. :) Como no estás interactuando con la Ventana, no sé qué desencadenaría esto, aparte de las animaciones para las dimensiones, la posición o la transformación del diseño. –

+0

Hmm la aplicación es bastante grande. Si LayoutUpdated no debe dispararse regularmente, ¿qué técnica puedo usar para descubrir por qué está disparando? –

Respuesta

7

Si está actualizando la UI desde el EventHandler que adjuntó al evento LayoutUpdated, ¡esto también activará ese evento!

Por ejemplo:

void my_LayoutUpdatedEvent(object sender, EventArgs e) 
    { 
     textBlock1.Text = "changed"; 
     Console.Out.WriteLine("text changed!"); 
    } 

entra en un bucle infinito de cambios.

Tal vez usted tiene que hacer algo como esto:

void my_BetterLayoutUpdatedEvent(object sender, EventArgs e) 
    { 
     if (!hasChanged) 
      textBlock1.Text = "changed"; 
     hasChanged = true; 
     Console.Out.WriteLine("text changed!"); 
    } 
+2

Un punto interesante, y lo hace sentido. Ya no estoy trabajando en esa aplicación, pero esto parece plausible. Espero que ayude a alguien más a salir. –

+0

¿Es posible verificar qué UI se estaba actualizando causando la invalidación? – simo

Cuestiones relacionadas