Trong Windows Forms, thuộc tính DoubleBuffered không ảnh hưởng đến điều khiển con như hộp văn bản. Thay vào đó nó chỉ ảnh hưởng đến biểu mẫu hoặc Bảng điều khiển mà nó được đặt cho.
Nếu bạn muốn đệm đôi cho các phần tử con trên biểu mẫu, bạn sẽ cần phải thực hiện đệm đôi thủ công.
Bob Powell đã viết good article (và những người khác) về cách thực hiện việc này.
Ngoài ra, từ một forum answer Bob cũng nói:
Quyền sở hữu của một cửa sổ có nghĩa là họ sẽ nhấp nháy không kiểm soát được bởi vì bạn không thể kích đúp đệm ngoài khu vực cửa sổ mục tiêu. Bảng điều khiển có điều khiển con không thể là được thực hiện để tự đệm đôi bộ đệm và đó là trẻ em chẳng hạn.
Cách duy nhất để thực hiện việc này là để tạo một điều khiển duy nhất thực hiện tất cả bản vẽ sử dụng dạng hệ thống đồ họa được giữ lại.
Do đó, để thay đổi kích thước hộp văn bản tự do bằng cách sử dụng bộ đệm đôi thủ công, bạn cần phải hiển thị hộp văn bản đó trở lại bộ đệm sau và hiển thị nó như một phần của bản cập nhật được lưu vào bộ đệm. Nếu thậm chí có thể, tôi không mong đợi điều này sẽ dễ dàng.
[Cập nhật]
Một số câu trả lời khác cho biết đây là vấn đề với Windows Forms cụ thể. Điều này là không chính xác, nó thực sự là sâu hơn sau đó và được gây ra bởi Windows GDI. Ví dụ, mở Notepad/Wordpad vv và dán một đoạn văn bản lớn, thay đổi kích thước cửa sổ và thông báo cùng một vấn đề nhấp nháy.
Đây là giải pháp cơ bản mà tôi đã sử dụng cách đây nhiều năm để làm điều tương tự. Nó là một biểu mẫu đơn giản có chứa một hộp văn bản nhiều dòng và một lớp tùy chỉnh kế thừa từ Bảng điều khiển. Cả hai điều khiển đều có cùng vị trí và kích thước. Nó sử dụng các hình thức ResizeBegin và ResizeEnd để hiển thị bảng điều khiển khi thay đổi kích thước, và hộp văn bản khác. Nó không hoàn hảo nhưng nó loại bỏ sự nhấp nháy.
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);
}
}
Thú vị đăng bài, tôi có vấn đề tương tự với một điều khiển nhãn, nhưng trên cơ sở mà tôi đọc DoubleBuffer chỉ nên được thiết lập với AllPaintInWmPaint mà chỉ nên được thiết lập với UserPaint tôi đã không đệm đôi nó ... – Ian
@romkyns, tôi đã cập nhật ans của tôi wer với một giải pháp tôi đã sử dụng trong quá khứ. – Ash