2010-02-26 29 views
10

Actualmente estoy trabajando en un programa que usa una estructura bastante compleja de controles winform anidados que cambia dinámicamente a medida que el usuario realiza determinadas selecciones. Para entrar en más detalles sobre el diseño específico de los controles sería extenso para esta pregunta.Cómo solucionar problemas de parpadeo del control winform anidado

Cuando se realiza una selección, se realizan muchas actualizaciones en el modelo subyacente controlado por los controles del usuario. Esto da como resultado una serie de cambios correspondientes en el tamaño/posición/visibilidad de los controles mostrados. Todos estos cambios producen un parpadeo dolorosamente intenso de los controles en la pantalla. Necesito arreglar esto de alguna manera para que cada vez que el usuario haga una selección, la pantalla quede congelada hasta que se completen todas las actualizaciones de control.

He intentado utilizar los métodos Control.SuspendLayout/Control.ResumeLayout en muchos lugares y formas diferentes y no puedo eliminar el parpadeo loco. Pensé que suspender el diseño en el control raíz durante los cambios solucionaría el problema, pero parece que este SuspendLayout no ayuda cuando se cambian los controles secundarios.

¿Debo utilizar algún otro enfoque en lugar de SuspendLayout? ¿Hay alguna manera de que pueda depurar SuspendLayout para ver por qué no parece estar en cascada para todos los controles secundarios?

+0

esta respuesta funcionó para mí http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children – wal

Respuesta

0

Utilice SetControlStyles en el control de usuario, la bandera es OptimizedDoubleBuffer que evitará el parpadeo.

2

Además de la sugerencia de @ tommieb75 para el doble almacenamiento en búfer, puede intentar y ver si sus controles de nivel raíz tienen BeginUpdate/EndUpdate pares de métodos. Esto debería ayudar a reprimir los repintes entre las llamadas.

+1

Otro par de métodos a tener en cuenta es 'SuspendLayout()' y 'ResumeLayout()' que pausará/reanudará la pintura del control – STW

0

Si está utilizando WinForms 2+, puede configurar el 'Control'. DoubleBuffer 'propiedad en el control a verdadero (incluso en el diseñador).

Con el marco 2, establecer DoubleBuffered establece los 3 indicadores: OptimizedDoubleBuffer, AllPaintingInWmPaint, y otro que olvidé, 'UserPaint' quizás.

Además, observe el BeginUpdate/EndUpdate como lo menciona @yetapb.

14

Suspend/ResumeLayout no es su problema aquí. Eso solo suspende el diseño automático, el tipo que se desencadena por las propiedades Anchor y Dock. El búfer doble tampoco puede solucionar su problema, solo suprime el parpadeo en cada control individual. Su verdadero problema es que está actualizando demasiados controles al mismo tiempo, cada uno tomará su turno para pintarse y eso lleva tiempo.

Lo que necesita es un tipo diferente de doble almacenamiento en búfer, composición. Comprueba si la solución en this thread resuelve tu problema.

+1

Yay, una forma adicional :) Espero que lo recuerde cuando lo necesite. –

+0

+1 salvaste mi día (aunque es tarde por la noche ...) – karlipoppins

+0

Gracias ... me salvó el tiempo =) – Emo

Cuestiones relacionadas