.Net CF防止过度狂热,不耐烦的点击(在重新绘制屏幕时)
时间:2020-03-06 14:55:41 来源:igfitidea点击:
.Net Compact框架
场景:用户在屏幕上。设备找不到打印机,并询问用户是否要重试。如果单击"否",则关闭当前屏幕,并返回到父菜单屏幕。如果他们多次单击"否"按钮,则第一个单击将被"否"按钮使用,而下一次单击将在屏幕完成重新绘制后生效。 (实际上是单击菜单项,然后将用户带到另一个屏幕。)
我看不到放置等待光标的好地方...当用户单击"否"时,除了关闭表单外,没有什么其他事情发生。但是CF框架重绘屏幕的速度很慢。
有任何想法吗?
解决方案
随意的想法:
- 模态对话框启动时,禁用父对话框上的某些控件。我不认为我们可以禁用整个表单,因为它是模式对话框的父级。
- 另外,我建议使用透明控件来捕获点击,但是CF不支持透明。
- 父对话框上有多少个控件?我还没有发现CF.Net更新太慢。对话框是否有可能过载,并且可以比子控件更快地自定义绘制?
- 重写DialogResult属性和该类的Dispose方法以处理添加/删除等待游标。
我们可以通过清除Windows消息队列来跳过未决的点击
Application.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等)。
问候,
坦贝格