【问题标题】:How do I autohide a form如何自动隐藏表单
【发布时间】:2015-03-06 09:17:00
【问题描述】:

我想我有一个非常简单的问题......我无法找到答案。我正在尝试为位于 (0,0) 处、宽度为 150 的无边框 WinForm 添加自动隐藏功能。我有以下代码:

    private int dx;

    private void autohide()
    {
        for (dx = 0; dx > -150; dx--)
        {
            this.Width = dx;
            Thread.Sleep(2);
        }
    }

即使在使用Thread.Sleep(x) 之后,表单也只是突然变为最终宽度,而不会产生/产生任何延迟效果。我正在尝试对其施加一些影响。

请帮忙...

【问题讨论】:

  • 你应该阅读Thread.Sleep的文档。
  • 睡眠 2 毫秒不会让您有足够长的时间看到发生的事情。我很好奇你为什么要这样做,而不仅仅是Hide 表单虽然
  • 这可能是因为您在主线程中执行此操作,即更新表单的同一线程。这是 WinForms 吗? WPF?
  • Application.DoEvents(呃)...?

标签: c# timer thread-sleep


【解决方案1】:

您面临的问题是因为窗口在任何时候都不会重新绘制自身,因为您的代码在 dx 为 150 之前不会退出 autohide() 例程,因此在重新绘制之前会有延迟最终位置。

您可能还想更改位置而不是宽度。

更好的选择是启动一个计时器,然后在每次触发时更改位置,这将导致更改为动画:

    private Timer t;
    private int step = 1;

    private void autohide()
    {
        t = new Timer();
        t.Interval = 2;
        t.Tick += T_Tick;
        t.Start();
    }

    private void T_Tick(object sender, EventArgs e)
    {
        if (this.Location.X > 0 - this.Width)
        {
            this.Location = new Point(this.Location.X - step, this.Location.Y);
        }
        else
        {
            t.Stop();
        }
    }

【讨论】:

  • 只是为了确定,这是否允许?我在想 Location 可能只能从 UI 线程更改。这不是从后台线程修改的吗?
  • 使用正确的计时器(共有三个,System.Windows.Forms.Timer、System.Threading.Timer 和 System.Timers.Timer),它将确保它在 UI 线程上运行。 System.Windows.Forms.Timer 回调 UI 线程。如果 UI 线程很忙,则使用此计时器会出现问题,但我认为这无关紧要。
猜你喜欢
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2010-10-06
相关资源
最近更新 更多