我有一个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);
我添加到主面板的一些用户控件在UI方面非常复杂。所以当this.pnlMainBody.Controls.Add(_pnlEmails);
触发时,我看到控件出现在屏幕上,然后它自己调整大小以填充面板控件的主体。
实际上这很难看,所以我想知道是否有办法在实际调整大小之前不显示调整大小?
我已尝试将用户控件的.Visible
设置为false。我试过.SuspendLayout
,但都无济于事。
有没有办法让屏幕转换顺畅?
答案 0 :(得分:1)
首先尝试通过设置:
打开父窗体中的双缓冲区绘制this.DoubleBuffered = true;
在你的加载处理程序或某个地方做这件事,看看闪烁是否消失。
如果这不起作用,您还可以尝试将子控件的DoubleBuffered属性设置为true(如果它们是.NET Control派生实体)。这里是我最近使用的一些代码,用于获取没有公开双缓冲区属性的控件以便很好地绘制:(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
答案 1 :(得分:1)
我想出了解决问题的诀窍。只要在将控件添加到主面板后设置Dock.Fill属性,就没有闪烁。
this.pnlMainBody.Controls.Add(_pnlEmails);
_pnlEmails.Dock = DockStyle.Fill;