Pregunta

Imagina que quieres animar algún objeto en un WinForm.Configura un temporizador para actualizar el estado o modelo y anula el evento de pintura del formulario.Pero a partir de ahí, ¿cuál es la mejor manera de volver a pintar continuamente el formulario para la animación?

  • ¿Invalidar el formulario tan pronto como termine de dibujar?
  • ¿Configurar un segundo temporizador e invalidar el formulario en intervalos regulares?
  • ¿Quizás exista un patrón común para esto?
  • ¿Existen clases .NET útiles que puedan ayudar?

Cada vez que necesito hacer esto descubro un nuevo método con un nuevo inconveniente.¿Cuáles son las experiencias y recomendaciones de la comunidad SO?

¿Fue útil?

Solución

En algunas situaciones, es más rápido y conveniente no dibujar usando el evento de pintura, sino obtener el objeto Gráficos del control/formulario y pintar "sobre" eso.Esto puede causar algunos problemas con la opacidad/antialiasing/texto, etc., pero podría valer la pena en términos de no tener que volver a pintar todo el shabang.Algo parecido a:

private void AnimationTimer_Tick(object sender, EventArgs args)
{
    // First paint background, like Clear(Control.Background), or by
    // painting an image you have previously buffered that was the background.
    animationControl.CreateGraphics().DrawImage(0, 0, animationImages[animationTick++])); 
}

Yo mismo uso esto en algunos controles y tengo imágenes almacenadas en el búfer para "borrar" el fondo cuando el objeto de interés se mueve o es necesario eliminarlo.

Otros consejos

He creado una biblioteca que podría ayudar con esto.Se llama Transiciones y se puede encontrar aquí: http://code.google.com/p/dot-net-transitions/

Utiliza temporizadores que se ejecutan en un hilo de fondo para animar los objetos.La biblioteca es de código abierto, por lo que si le resulta útil, puede mirar el código para ver qué está haciendo.

Lo que estás haciendo es la única solución que he usado en WinForms (un temporizador con redibujos constantes).Hay un montón de técnicas que puede utilizar para hacer que la experiencia del usuario sea más fluida (como el doble almacenamiento en búfer).

Quizás quieras probar WPF.Hay funciones integradas para realizar animaciones en WPF y son mucho más fluidas (y requieren menos código y ninguna sincronización de su parte) que una solución basada en temporizador.

Tenga en cuenta que no necesita utilizar WPF en toda la aplicación para esa solución;Es posible empaquetar esta funcionalidad en un control WPF e incrustar el control en una aplicación WinForms (o una aplicación no administrada, para el caso):

http://www.codeproject.com/KB/WPF/WPF_UserControls.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top