表单加载时C#WaitCursor

时间:2009-11-30 21:47:25

标签: c# winforms forms cursors

我的表格需要几秒钟才能最终显示。此表单通过以下方式调用:

using (ResultsForm frm = new ResultsForm())
{
    this.Visible = false;
    frm.ShowDialog();
    this.Visible = true;
}

在等待表单最终显示时,我将默认光标移到Cursors.WaitCursor是很有用的。目前,我似乎只能通过使用静态“当前”属性来成功完成此操作:

using (ResultsForm frm = new ResultsForm())
{
    //this.Visible = false;
    Cursor.Current = Cursors.WaitCursor;
    frm.ShowDialog();
    //this.Visible = true;
}

但这有两个问题:

  • 它强制我禁用我想要保留的MainForm隐藏功能。
  • 由于需要在ResultsForm Shown事件中调用Cursor.Current = Cursor.Default;,因此会增加耦合。

如何在表单加载时更改光标而不更改第一个代码段并避免耦合?

更新 现在问题得到解答,视频演示已被删除,因此我不会检查我的ISP带宽限制。

5 个答案:

答案 0 :(得分:2)

  

它迫使我禁用我想保留的MainForm隐藏功能。

你应该能够做到这两点,没有问题。

  

它增加了耦合,因为Cursor.Current = Cursor.Default;需要在ResultsForm显示的事件中调用

您是否尝试将光标逻辑完全放入ResultsForm对话框代码中?您应该能够在ResultsForm的构造函数中设置Cursor.Current = Cursors.WaitCursor;,然后在Cursor.Current = Cursor.Default;事件中设置Shown

这将使逻辑完全保留在对话框中,并且不在主窗口中。然后,您还可以在主窗口中保持可见性切换。

答案 1 :(得分:1)

为什么你要删除this.Visible = false?您仍然可以在设置光标时执行此操作。

让ResultsForm设置光标而不是父窗体是否是可接受的解决方案?让它在启动代码一直占用之前设置光标,然后在最后设置它。

答案 2 :(得分:1)

如果您总是希望在加载此表单时显示等待光标(无论是否显示),那么,正如Reed建议的那样,您应该只在表单中执行此操作。

但是,如果在显示表单的这种特殊情况下只需要光标,那么您可以使用lambda(或匿名委托,如果您正在处理C#2.0)来处理事件处理程序:

using (ResultsForm frm = new ResultsForm())
{
    this.Visible = false;

    var oldCursor = Cursor.Current;
    Action<object, EventArgs> restoreCursor = 
        delegate
        {
            Cursor.Current = oldCursor;
            frm.Shown -= restoreCursor;
        };
    frm.Shown += restoreCursor;

    Cursor.Current  = Cursor.WaitCursor
    frm.ShowDialog();
}

答案 3 :(得分:1)

光标将变为WaitCursor,但只能在几分之一秒内存活。问题是隐藏主窗体会使光标与主窗体后面的窗口重叠。或桌面。显示的窗口从Windows获取WM_SETCURSOR消息,它将光标更改为其首选形状。

但是你的方法存在更大的问题。对话框关闭后,只有几分之一秒,您的应用程序中没有窗口可见。 Windows被迫找到另一个窗口来关注,它不会是你应用程序中的窗口。当您的主要形式再次变得可见时,它可能最终会在获得焦点的窗口后面。这种行为往往有点不稳定,你可能还没有找到它。

您可以通过以不同方式隐藏窗口来解决这两个问题:

  this.Opacity = 0.01;

答案 4 :(得分:0)

您可以将主窗体设为第二个窗体的所有者,并将其设置为模态:

frm.ShowDialog(this);

然后在frm中添加“Cursor.Current = Cursors.WaitCursor;”在构造函数中添加“Cursor.Current = Cursor.Default;”在Shown事件中。

我用按钮尝试过这个功能。等待光标显示,然后在表单加载后返回默认值:

Form1中:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WaitCursorTwoForms
{
   public partial class Form1 : Form
   {
      public Form1()
      {
         InitializeComponent();
      }

      private void ButtonClick(object sender, EventArgs e)
      {
         using(Form2 form2 = new Form2())
         {
            form2.ShowDialog(this);
         }
      }
   }
}

窗体2:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WaitCursorTwoForms
{
   public partial class Form2 : Form
   {
      public Form2()
      {
         Cursor.Current = Cursors.WaitCursor;
         InitializeComponent();
         for (int i = 0; i < 10; i++)
         {
            Thread.Sleep(1000);
         }
      }

      private void OnShown(object sender, EventArgs e)
      {         
         Cursor.Current = Cursors.Default;
      }
   }
}