我的表格需要几秒钟才能最终显示。此表单通过以下方式调用:
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;
}
但这有两个问题:
Cursor.Current = Cursor.Default;
,因此会增加耦合。如何在表单加载时更改光标而不更改第一个代码段并避免耦合?
更新 现在问题得到解答,视频演示已被删除,因此我不会检查我的ISP带宽限制。
答案 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;
}
}
}