C# 如何在WinForms中平滑转换面板?

C# 如何在WinForms中平滑转换面板?,c#,winforms,C#,Winforms,我试图从表单的左边缘拿出一份菜单。当我这样做的时候,我希望表单顶部的面板收缩。面板上有按钮,锚定设置为“右” 面板通过向左移动并将宽度减小相同的量来调整大小-因此按钮应保持在屏幕上的相同位置。按钮确实放在正确的位置,但这样做看起来很糟糕。尽管我用.Bounds=new Rectangle(…)设置了面板的新尺寸,但看起来好像我设置了Left属性,然后设置了带有时间延迟的宽度!我把SuspendLayout搞乱了,没有任何影响。我确信有一个简单的方法可以解决这个问题。我创建了一个简单的示例: pr

我试图从表单的左边缘拿出一份菜单。当我这样做的时候,我希望表单顶部的面板收缩。面板上有按钮,锚定设置为“右”

面板通过向左移动并将宽度减小相同的量来调整大小-因此按钮应保持在屏幕上的相同位置。按钮确实放在正确的位置,但这样做看起来很糟糕。尽管我用.Bounds=new Rectangle(…)设置了面板的新尺寸,但看起来好像我设置了Left属性,然后设置了带有时间延迟的宽度!我把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;
}

我已将此代码和设计器代码放在此处:

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

protected override CreateParams CreateParams
{
    get
    {
        const int WS_EX_COMPOSITED = 0x02000000;
        var cp = base.CreateParams;
        cp.ExStyle |= WS_EX_COMPOSITED;
        return cp;
    }
}
它的双缓冲区覆盖整个窗口表面,包括子控件


有关值,请参见,包括WS_EX_COMPOSITED

@X-TECH是,我希望示例中的按钮不会出现移动。如果github项目没有显示问题,则按钮会像岩石一样稳定。应该如此。Windows版本可能很重要。@HansPassant嗯,我用Win7 x64。你可以把这个方法放在你的表单下。。。0x020000000是什么样式位请参见此处获取值,包括WS_EX_COMPOSITED:So。。。Form.DoubleBuffered=true并不意味着WS_EX_COMPOSITED?@Rob
Form.DoubleBuffered
double buffers表单
WS_EX_COMPOSITED
double缓冲窗体及其所有子控件。