【问题标题】:How to smoothly transition a panel in WinForms?如何在 WinForms 中平滑过渡面板?
【发布时间】:2015-08-31 23:18:46
【问题描述】:

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

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

【问题讨论】:

  • @X-TECH 是的,我希望示例中的按钮看起来不会移动
  • 你的github项目没有演示问题,按钮稳如磐石。正如他们应该的那样。 Windows 版本可能很重要。
  • @HansPassant 嗯,我的 Win7 x64。

标签: c# winforms


【解决方案1】:

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

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

【讨论】:

  • 你可以把这个方法放在你的表单构造函数下
  • 我的意思是......什么风格位是0x02000000
  • 查看这里的值,包括 WS_EX_COMPOSITED:msdn.microsoft.com/en-us/library/windows/desktop/ff700543.aspx
  • 所以... Form.DoubleBuffered=true 并不意味着 WS_EX_COMPOSITED?
  • @Rob Form.DoubleBuffered 双缓冲表单。 WS_EX_COMPOSITED 双缓冲表单及其所有子控件。
猜你喜欢
  • 2019-12-31
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 2011-08-16
  • 1970-01-01
相关资源
最近更新 更多