visual texto propiedades parpadeante example c# winforms

c# - texto - propiedades de timer en visual basic



La actualizaciĆ³n de la forma visual c#produce un parpadeo (10)

Tengo una aplicación .net que he escrito en c #. En algunos formularios, frecuente los campos de visualización. En algunos casos, todos los campos del formulario (cuadros de texto, etiquetas, cuadro de imagen, etc.) cambian su valor. Además, la frecuencia de los cambios podría ser cada segundo. Sin embargo, actualmente hay un parpadeo horrible cada vez que se actualiza el formulario. ¿Cómo puedo detener el parpadeo? ¿Hay alguna manera de tal vez doble buffer? ¡Por favor ayuda!


El efecto fantasma suele deberse a que se está ejecutando en un solo subproceso y se está reteniendo con las actualizaciones de campo para que el evento de pintura no se active. Una forma de solucionar esto sería poner el trabajo pesado en métodos asíncronos. Esto permitirá que el formulario se vuelva a pintar y actualice lo que sea necesario cuando vuelvan a llamar al método asincrónico.


Esto funcionó para mí.

http://www.syncfusion.com/faq/windowsforms/search/558.aspx

Básicamente implica derivar del control deseado y establecer los siguientes estilos.

SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.DoubleBuffer, true);


No investigaste esto bien. Hay una propiedad DoubleBuffered en cada formulario. Intenta configurar eso en verdadero. Si no has sobrecargado nada en la pintura de formularios, todo debería funcionar.


Podría intentar llamar a esto. SuspenderLayout (); antes de comenzar su actualización y this.ResumeLayout (false); Cuando haya terminado de configurar todos los valores de esta manera, evitará que el formulario escriba valores uno a la vez.


Puede duplicar el búfer en casi todos los controles de formularios de Windows, aunque la mayoría de las veces requiere que herede el control deseado y anule una propiedad protegida. Tenga en cuenta, sin embargo, que he pasado bastante tiempo con el mismo problema y todavía tengo que eliminar completamente el parpadeo en mis formas más complejas.

Si quieres ventanas realmente sin parpadeos, sugiero mirar WPF.


Puede reemplazar el control original por uno personalizado que tenga la propiedad DoubleBuffered protegida en verdadero. Por ejemplo, para ListView sería algo como esto:

internal class DoubleBufferedListView : ListView { public DoubleBufferedListView() : base() { this.DoubleBuffered = true; } }

Después de eso, simplemente visita el archivo * .Designer.cs y reemplaza todas las menciones de control nativo con este.

PD En lugar de heredar el control, también puede establecer esta propiedad mediante la reflexión:

listView1.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(lsvReport, true, null);

No está limpio ni recomendado, pero no requiere cambios en los archivos * .Designer.cs.


Sé que esta pregunta es antigua, pero puede ser que otros la busquen en el futuro.

DoubleBuffering no siempre funciona bien. Para forzar la forma de que nunca parpadee en absoluto (pero a veces causa problemas de dibujo):

protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED return cp; } }

Para dejar de parpadear cuando un usuario cambia el tamaño de un formulario, pero sin estropear el dibujo de los controles (siempre que su nombre de formulario sea "Form1"):

int intOriginalExStyle = -1; bool bEnableAntiFlicker = true; public Form1() { ToggleAntiFlicker(false); InitializeComponent(); this.ResizeBegin += new EventHandler(Form1_ResizeBegin); this.ResizeEnd += new EventHandler(Form1_ResizeEnd); } protected override CreateParams CreateParams { get { if (intOriginalExStyle == -1) { intOriginalExStyle = base.CreateParams.ExStyle; } CreateParams cp = base.CreateParams; if (bEnableAntiFlicker) { cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED } else { cp.ExStyle = intOriginalExStyle; } return cp; } } private void Form1_ResizeBegin(object sender, EventArgs e) { ToggleAntiFlicker(true); } private void Form1_ResizeEnd(object sender, EventArgs e) { ToggleAntiFlicker(false); } private void ToggleAntiFlicker(bool Enable) { bEnableAntiFlicker = Enable; //hacky, but works this.MaximizeBox = true; }


También podría ser causado por su codificación, no por la ausencia de doble buffer. Vine aquí con un problema similar pero me di cuenta de que es porque:

  1. Establecí un marco en invisible cuando un elemento no está seleccionado.
  2. Entre las selecciones de usuario, el control ListView borra el índice.
  3. Estoy obligado al evento SelectedIndexChanged

En otras palabras:

  • El usuario hace clic en el elemento 1
    ~ SelectedIndexChanged (1)
  • El usuario hace clic en el elemento 2
    ~ SelectedIndexChanged (-1) <---- Esto causa el parpadeo
    ~ SelectedIndexChanged (2)

Entonces, ¿cuál es la solución? ¿Cómo evitar miles de eventos innecesarios ListView.SelectedIndexChanged?


Tuve el mismo problema con OpenGLES, que es cómo encontré este hilo. por supuesto, me doy cuenta de que no estás usando ogl, pero tal vez esto te ayude de todos modos;)

protected override void OnPaintBackground(PaintEventArgs e) { }


la respuesta corta es

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

la respuesta larga es: ver MSDN o google

solo por diversión, intente llamar a Application.DoEvents () después de actualizar cada elemento, y vea si el problema mejora o empeora ;-)