ControlHelper.SuspendDrawing(panel);
panel.Controls.Clear();
AddItemIdLabel();
AddLastEditedLabel();
AddDeleteButton();
AddSaveButton();
ControlHelper.ResumeDrawing(panel);
public static class ControlHelper
{
[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
private const int WM_SETREDRAW = 0xB;
public static void SuspendDrawing(Control target)
{
SendMessage(target.Handle, WM_SETREDRAW, 0, 0);
}
public static void ResumeDrawing(Control target)
{
SendMessage(target.Handle, WM_SETREDRAW, 1, 0);
target.Refresh();
}
}
如果我使用上面的代码进行测试,面板的某些部分不会被刷新。您可以在没有添加新控件的地方看到 Clear() 之前的旧控件。
如果我把它放在panel.Controls.Clear();
前面,ControlHelper.SuspendDrawing(panel);
一切都按预期工作,但我试图避免一些闪烁是可见的。
那么这里发生了什么?取决于我是在暂停之前还是之后清除控件集合,如何产生影响?