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

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

面板通过向左移动并将宽度减小相同的量来resize – 因此按钮应保持在屏幕上的相同位置。 按钮确实保持在正确的位置,但看起来很糟糕。 即使我使用.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

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

 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