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