.Net CF 防止过度、不耐烦的点击(屏幕重绘时)
Posted
技术标签:
【中文标题】.Net CF 防止过度、不耐烦的点击(屏幕重绘时)【英文标题】:.Net CF Prevent Overzealous, Impatient Clicking (while screen is redrawing) 【发布时间】:2010-09-14 06:53:57 【问题描述】:.Net Compact Framework
场景:用户在屏幕上。设备找不到打印机并询问用户是否要重试。如果他们单击“否”,则关闭当前屏幕并返回到父菜单屏幕。如果他们多次单击“否”按钮,第一次单击将被“否”按钮使用,下一次单击将在屏幕完成重绘后生效。 (实际上是单击一个菜单项,然后将用户带到另一个屏幕。)
我没有看到放置等待光标的好地方...当用户单击“否”时,除了表单关闭之外,没有发生太多事情。但是CF框架重绘屏幕很慢。
有什么想法吗?
【问题讨论】:
【参考方案1】:您可以通过清除 Windows 消息队列来跳过待处理的点击 应用程序.DoEvents();
我们使用以下自定义事件类来解决您的问题(防止多次点击并在必要时显示等待光标):
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、...)的控件。
问候, 坦伯格
【讨论】:
这很奇怪,因为我不认为 CF 在关键事件上会玩同样的游戏。我尝试用键做类似的事情,但最终不得不设置一个门,跳转线程,然后 Application.DoEvents 来刷新键盘缓冲区以防止获得多个键事件。 嗨,据我所知,键事件是从另一个线程触发的,而鼠标事件是从 GUI 线程触发的。【参考方案2】:随意的想法:
在模式对话框启动时禁用父对话框上的某些控件。我不相信您可以禁用整个表单,因为它是模态对话框的父级。 或者,我建议使用透明控件来捕获点击,但 CF 不支持透明度。 父对话框上有多少个控件?我还没有发现 CF.Net 更新速度慢。对话框是否有可能超载并且可以比使用子控件更快地自定义绘制? 覆盖 DialogResult 属性和类的 Dispose 方法以处理添加/删除等待光标。【讨论】:
好建议,给我一些其他的尝试。谢谢! 您可以使用 CF 进行适当的透明度,但您必须通过 P/Invoke 将矩形区域粘合在一起。不是很漂亮。以上是关于.Net CF 防止过度、不耐烦的点击(屏幕重绘时)的主要内容,如果未能解决你的问题,请参考以下文章