0

我有一个 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,都无济于事。

有没有办法做到这一点,使屏幕过渡平滑?

4

2 回答 2

1

首先尝试通过设置在父窗体中打开双缓冲绘画:

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
于 2010-03-29T21:58:03.230 回答
1

我想出了解决问题的诀窍。只要我在将控件添加到主面板后设置了 Dock.Fill 属性,就没有闪烁。

this.pnlMainBody.Controls.Add(_pnlEmails);
_pnlEmails.Dock = DockStyle.Fill;
于 2010-03-30T00:59:05.437 回答