.Net 紧凑型框架
场景:用户在屏幕上。设备找不到打印机并询问用户是否要重试。如果他们单击“否”,则关闭当前屏幕并返回到父菜单屏幕。如果他们多次单击“否”按钮,第一次单击将被“否”按钮使用,下一次单击将在屏幕完成重绘后生效。(实际上是单击一个菜单项,然后将用户带到另一个屏幕。)
我看不到放置等待光标的好地方……当用户单击“否”时,除了表单关闭外,没有发生太多事情。但是CF框架重绘屏幕很慢。
有任何想法吗?
.Net 紧凑型框架
场景:用户在屏幕上。设备找不到打印机并询问用户是否要重试。如果他们单击“否”,则关闭当前屏幕并返回到父菜单屏幕。如果他们多次单击“否”按钮,第一次单击将被“否”按钮使用,下一次单击将在屏幕完成重绘后生效。(实际上是单击一个菜单项,然后将用户带到另一个屏幕。)
我看不到放置等待光标的好地方……当用户单击“否”时,除了表单关闭外,没有发生太多事情。但是CF框架重绘屏幕很慢。
有任何想法吗?
您可以通过使用 Application.DoEvents() 清除 Windows 消息队列来跳过挂起的点击;
我们使用以下自定义事件类来解决您的问题(防止多次单击并在必要时显示等待光标):
using System;
using System.Windows.Forms;
public sealed class Event {
bool forwarding;
public event EventHandler Action;
void Forward (object o, EventArgs a) {
if ((Action != null) && (!forwarding)) {
forwarding = true;
Cursor cursor = Cursor.Current;
try {
Cursor.Current = Cursors.WaitCursor;
Action(o, a);
} finally {
Cursor.Current = cursor;
Application.DoEvents();
forwarding = false;
}
}
}
public EventHandler Handler {
get {
return new EventHandler(Forward);
}
}
}
您可以验证它是否适用于以下示例(仅当 HandleClick 已终止时,控制台才会输出单击):
using System;
using System.Threading;
using System.Windows.Forms;
class Program {
static void HandleClick (object o, EventArgs a) {
Console.WriteLine("Click");
Thread.Sleep(1000);
}
static void Main () {
Form f = new Form();
Button b = new Button();
//b.Click += new EventHandler(HandleClick);
Event e = new Event();
e.Action += new EventHandler(HandleClick);
b.Click += e.Handler;
f.Controls.Add(b);
Application.Run(f);
}
}
要重现您的问题,请按如下方式更改上述代码(控制台输出所有点击,有延迟):
b.Click += new EventHandler(HandleClick);
//Event e = new Event();
//e.Action += new EventHandler(HandleClick);
//b.Click += e.Handler;
Event 类可用于公开 EventHandler 事件(Button、MenuItem、ListView、...)的每个控件。
问候,坦伯格
随意的想法: