У меня есть «Основная» форма с кнопками навигации слева и панель справа, которую я использую в качестве держателя для дочерних форм. Это довольно просто, но код этого ниже.
public void showForm(Form form)
{
// Disposed Prior Form & Load New
form.Dock = DockStyle.Fill;
form.TopLevel = false;
pnlMain.Controls.Clear();
pnlMain.Controls.Add(form);
form.Show();
}
Основная проблема, с которой я сталкиваюсь, заключается в том, что все работает нормально, я практически не мерцаю, используя приведенный ниже код при переходе от формы к форме, но как только я максимизирую свою «основную» форму (которая, в свою очередь, увеличивает « Дочерняя форма) ... даже если я разверну и вернусь к исходному размеру, он начнет мерцать как сумасшедший, когда я перейду к новой форме. Это как если бы после максимизации он полностью игнорировал код, введенный для исправления мерцания. Я должен также упомянуть, что у «дочерней» формы есть свое собственное событие рисования формы, поэтому у меня есть эти вещи, чтобы уменьшить мерцание, обычно это не проблема до максимизации.
public void drawBackgroundChild(PaintEventArgs e, Form form)
{
// prevents error on resize
if (form.ClientRectangle.Width == 0 || form.ClientRectangle.Height == 0)
return;
using (LinearGradientBrush brush = new LinearGradientBrush(form.ClientRectangle,
UserSettings.secondaryColor1,
UserSettings.secondaryColor2,
90F))
{
e.Graphics.FillRectangle(brush, form.ClientRectangle);
}
}
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
Я несколько раз пробовал код, указанный выше, а также код, указанный ниже, в формах «Master» и «Child». Протестировал кучу разных способов, но не повезло. Кто-нибудь знает, отключает ли изменение формы Windows двойную буферизацию или что-то в этом роде?
DoubleBuffered = true;
this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, true);