如何在WinForms中平滑过渡面板?

时间:2015-08-27 11:30:14

标签: c# winforms

我正在尝试从表单的左边缘显示一个菜单。当我这样做时,我希望表单顶部的面板缩小。面板上有按钮,锚点设置为'右边。

面板调整大小,向左移动并减小相同的宽度 - 因此按钮应保持在屏幕上的相同位置。按钮确实保持在正确的位置,但看起来很糟糕。即使我使用.Bounds = new Rectangle(...)设置面板的新尺寸,它看起来好像我设置了Left属性,然后设置了Width,带有时间延迟!我搞乱了SuspendLayout并没有任何影响。我确信这有一个简单的方法。我创建的一个简单的例子:

private void StartTest_Click( object sender, EventArgs e )
{
    _AmountLeft = PanelToResize.Width / 2; // half of it
    _Step = _AmountLeft / 10;
    Ticker.Enabled = true;
}

private void Ticker_Tick( object sender, EventArgs e )
{
    int this_bit = Math.Min( _AmountLeft, _Step );
    // reduce
    PanelToResize.Bounds = new Rectangle( PanelToResize.Left + this_bit, PanelToResize.Top, PanelToResize.Width - this_bit, PanelToResize.Height );
    if (this_bit == _AmountLeft)
        Ticker.Enabled = false;
    _AmountLeft -= this_bit;
}

我已将此代码和设计器代码放在此处:https://gist.github.com/anonymous/acf0ec4d5c81dbc5a670

1 个答案:

答案 0 :(得分:3)

在表单中尝试以下代码以减少闪烁。

protected override CreateParams CreateParams
{
    get
    {
        const int WS_EX_COMPOSITED = 0x02000000;
        var cp = base.CreateParams;
        cp.ExStyle |= WS_EX_COMPOSITED;
        return cp;
    }
}

它的双缓冲整个窗口表面,包括子控件

请参阅here了解值,包括WS_EX_COMPOSITED