In Windows Form la proprietà DoubleBuffered non ha alcun effetto sui controlli secondari come le caselle di testo. Invece influenza solo il modulo o il pannello per cui è impostato.
Se si desidera il doppio buffering per elementi figlio in un modulo, è necessario implementare il doppio buffering manuale.
Bob Powell ha scritto uno good article (e altri) su come farlo.
Inoltre, da un forum answer Bob dice anche:
La proprietà di una finestra significa che essi sfarfallio incontrollabile perché non è possibile fare doppio-buffer al di fuori dell'area di destinazione di Windows. Un pannello con controlli figlio non può essere impostato su doppio buffer e ad esempio bambini.
L'unico modo per farlo correttamente è per creare un unico comando che fa tutto il disegno utilizzando una forma di sistema grafico modalità trattenuta.
Pertanto, per ottenere il ridimensionamento della casella di testo senza sfarfallio utilizzando il doppio buffering manuale è necessario eseguire in qualche modo il rendering della casella di testo sul buffer posteriore e quindi visualizzarlo come parte dell'aggiornamento memorizzato. Se possibile, non mi aspetto che sarebbe facile.
[Update]
Alcune altre risposte hanno detto che questo è un problema con Windows Form in particolare. Questo non è corretto, in realtà è più profondo di quello ed è causato da GDI di Windows. Ad esempio, apri Blocco note/Wordpad ecc. E incolla una grande porzione di testo, ridimensiona la finestra e noti lo stesso problema di sfarfallio.
Ecco una soluzione di base che ho usato anni fa per fare qualcosa di simile. Si tratta di un semplice modulo contenente una casella di testo multilinea e una classe personalizzata ereditata da Panel. Entrambi i controlli hanno la stessa posizione e dimensioni. Usa Forms ResizeBegin e ResizeEnd per mostrare il pannello durante il ridimensionamento e altrimenti la casella di testo. Non è perfetto ma elimina lo sfarfallio.
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);
}
}
Post interessante, ho problemi simili con un controllo etichetta, ma sulla base del fatto che leggo DoubleBuffer deve essere impostato solo con AllPaintInWmPaint che dovrebbe essere impostato solo con UserPaint I non ha doppio buffer di esso ... – Ian
@romkyns, ho aggiornato i miei ans con una soluzione che ho usato in passato. – Ash