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()之前的旧控件。将WM_SETREDRAW消息发送到面板后刷新
如果我把panel.Controls.Clear();
前ControlHelper.SuspendDrawing(panel);
一切正常intented 但一些闪烁是可见的,我正在努力避免的。
那么这里发生了什么?如何根据我在暂停之前还是之后清除控制集合有所作为?