Проблемы с перерисовкой и мерцанием - PullRequest
0 голосов
/ 30 марта 2010

У меня есть приложение в стиле Outlook. Так что в основном у меня есть боковая панель слева и справа у меня есть панель управления (pnlMainBody), которая содержит контент.

Контент, как правило, представляет собой пользовательский элемент управления, который я добавляю на панель, когда пользователь нажимает соответствующую кнопку на боковой панели. Я добавляю пользовательский элемент управления на панель следующим образом:

// _pnlEmails is the User Control that I am adding to the panel
_pnlEmails = new pnlEmails();
_pnlEmails.Dock = DockStyle.Fill;
this.pnlMainBody.Controls.Add(_pnlEmails);

Некоторые пользовательские элементы управления, которые я добавляю в основную панель, довольно сложны с точки зрения пользовательского интерфейса. Поэтому, когда срабатывает this.pnlMainBody.Controls.Add(_pnlEmails);, на экране появляется элемент управления, а затем он изменяет свой размер, заполняя тело элемента управления панели.

Это на самом деле довольно уродливо, так что мне было интересно, есть ли способ не показывать изменение размера, пока оно фактически не закончило изменение размера?

Я попытался установить для .Visible пользовательского элемента управления значение false. Я пытался сделать .SuspendLayout, но все безрезультатно.

Есть ли способ сделать это, чтобы переходы экрана были плавными?

Ответы [ 2 ]

1 голос
/ 30 марта 2010

Я понял хитрость в решении проблемы. Пока я настраиваю свойство Dock.Fill после добавления элемента управления на главную панель, мерцания нет.

this.pnlMainBody.Controls.Add(_pnlEmails);
_pnlEmails.Dock = DockStyle.Fill;
1 голос
/ 30 марта 2010

Сначала попробуйте включить рисование двойного буфера в родительской форме, установив:

this.DoubleBuffered = true;

Сделайте это в вашем обработчике нагрузки или в каком-то другом месте, чтобы увидеть, исчезает ли мерцание.

Если это не сработает, вы можете также попытаться установить для свойства DoubleBuffered значение true для дочерних элементов управления, если они являются производными от элемента управления .NET. Вот некоторый код, который я недавно использовал, чтобы получить элементы управления, которые не отображают свойство двойного буфера для приятного рисования: (версия vb. Вам нужен C #?)

Private Sub ForceDoubleBuffering(ByVal o As Object)
    Dim ctrl As Control
    Dim method As Reflection.MethodInfo
    Dim flags As Reflection.BindingFlags
    ctrl = TryCast(o, Control)
    flags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic
    method = ctrl.GetType().GetMethod("SetStyle", flags)
    method.Invoke(ctrl, New Object() {ControlStyles.OptimizedDoubleBuffer, True})
End Sub
...