tamaño tag mas hacer grande form contenido como cambiar aumentar altura ajustar .net winforms flicker

.net - tag - ¿Cómo evitar que un TextBox de Windows Forms parpadee al cambiar el tamaño?



tag en c# (4)

En los formularios de Windows, la propiedad DoubleBuffered no afecta a los controles secundarios, como los cuadros de texto. En cambio, afecta solo al formulario o al Panel para el que está configurado.

Si desea doble búfer para elementos secundarios en un formulario, deberá implementar doble búfer manual.

Bob Powell ha escrito un buen artículo (y otros) sobre cómo hacer esto.

Además, desde un foro responde Bob también dice:

La propiedad de una ventana significa que parpadearán incontrolablemente porque no puede duplicar el búfer fuera del área de ventanas de destino. No se puede hacer un panel con controles secundarios para duplicar el búfer en sí mismo y , por ejemplo, los niños.

La única forma de hacerlo correctamente es crear un único control que haga todo el dibujo utilizando una forma de sistema de gráficos en modo retenido.

Por lo tanto, para obtener el tamaño del cuadro de texto sin parpadeo utilizando el búfer doble manual, de alguna manera necesitaría renderizar el cuadro de texto a su búfer posterior y luego mostrarlo como parte de la actualización del búfer. Si es posible, no espero que esto sea fácil.

[Actualizar]

Algunas otras respuestas han dicho que este es un problema con Windows Forms específicamente. Esto no es correcto, en realidad es más profundo que eso y es causado por Windows GDI. Como ejemplo, abra el Bloc de notas / WordPad, etc. y pegue una gran porción de texto, cambie el tamaño de la ventana y observe el mismo problema de parpadeo.

Aquí hay una solución básica que utilicé hace años para hacer algo similar. Es un formulario simple que contiene un cuadro de texto multilínea y una clase personalizada que se hereda del Panel. Ambos controles tienen la misma ubicación y tamaño. Utiliza los formularios ResizeBegin y ResizeEnd para mostrar el panel al cambiar el tamaño y, de lo contrario, el cuadro de texto. No es perfecto pero elimina el parpadeo.

public partial class Form1 : Form { public Form1() { InitializeComponent(); } Bitmap bm = null; private void textBox1_Resize(object sender, EventArgs e) { Graphics g = textBox1.CreateGraphics(); if (g.VisibleClipBounds.IsEmpty == false) { bm = new Bitmap((int)g.VisibleClipBounds.Width, (int)g.VisibleClipBounds.Height); textBox1.DrawToBitmap(bm, new Rectangle(0, 0, (int)g.VisibleClipBounds.Width, (int)g.VisibleClipBounds.Height)); } g.Dispose(); } private void panelDB1_Paint(object sender, PaintEventArgs e) { if (bm != null) { e.Graphics.DrawImageUnscaled(bm, 0, 0,bm.Width,bm.Height ); } } private void Form1_ResizeBegin(object sender, EventArgs e) { panelDB1.BringToFront(); } private void Form1_ResizeEnd(object sender, EventArgs e) { panelDB1.SendToBack(); } } class PanelDB : Panel { public PanelDB() { this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer,true); //this.DoubleBuffered = true; } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); } }

Hay muchos artículos que tratan el parpadeo en los formularios Windows Forms. La mayoría recomienda configurar DoubleBuffered = true o configurar un grupo de banderas ControlStyle . Sin embargo, ninguno de estos ayuda a reducir el parpadeo de un TextBox.

Aquí hay un par de preguntas relacionadas:

Para reproducir el problema, cree un nuevo proyecto de WinForms, agregue un TextBox , habilite varias líneas, desactive el ajuste de palabras, agregue un montón de texto, establezca Anchor a Izquierda + Derecha + Superior + Inferior. Ahora ejecuta y redimensiona. El texto parpadea. Para cuadros de texto dentro de un par de TableLayoutPanel anidados, el parpadeo en el cambio de tamaño es aún peor.

En el mejor de los casos, aplicar las soluciones propuestas en las preguntas anteriores no soluciona el parpadeo; si me pongo experimental y configuro el ControlStyle de TextBox protegido en TextBox , puedo romperlo por completo (al habilitar UserPaint ) pero no eliminar el parpadeo.

Entonces, ¿hay alguna forma de arreglar el parpadeo del texto en un TextBox?


FUNCIÓN LockWindow COMO LARGO CONTROL ENVIAR ghDlg,% TEXT_UPPER,% WM_SETREDRAW, 0,0 CLEARBuffers END FUNCTION

FUNCIÓN Desbloquear la ventana COMO BOLSOS ClearBuffers. CONTROL ENVIAR ghDlg,% TEXT_UPPER,% WM_SETREDRAW, 1,0 FUNCIÓN FINAL


Hemos encontrado el mismo tipo de problema en el pasado y se trata de un uso excesivo de paneles de acoplamiento y diseño de tablas. Sugeriré, si es posible, intentar reconstruir la interfaz de usuario con un uso mínimo de acoplamiento (ya que el panel de diseño de la tabla también usa acoplamiento interno).


Usualmente uso un RichTextBox en lugar de un TextBox multilínea. Al establecer las propiedades DetectUrls- y ShortcutsEnabled en false, el RTB se comporta de manera muy similar a un TextBox y ... no tiene parpadeo .