.Net CF防止过度热情,不耐烦点击(屏幕重绘时)

时间:2008-09-30 15:14:24

标签: forms compact-framework refresh

.Net Compact Framework

场景:用户在屏幕上。设备无法找到打印机并询问用户是否要再次尝试。如果他们单击“否”,则关闭当前屏幕并将其返回到父菜单屏幕。如果他们多次单击“否”按钮,则第一次单击将由“否”按钮使用,下一次单击将在屏幕完成重绘后生效。 (实际上是单击一个菜单项,然后将用户带到另一个屏幕。)

我没有看到放置等待光标的好地方......当用户单击“否”时,除了表单关闭之外没有太多发生。但是CF框架重绘屏幕的速度很慢。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以通过清除Windows消息队列来跳过挂起的点击 Application.DoEvents();

我们使用以下自定义Event类来解决您的问题(防止多次点击并在必要时显示等待光标):

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,...)。

此致 tamberg

答案 1 :(得分:2)

随机想法:

  • 在模式对话框启动时禁用父对话框上的某些控件。我不相信您可以禁用整个表单,因为它是模式对话框的父级。
  • 或者我建议使用Transparent控件来捕获点击,但CF不支持透明度。
  • 父对话框中有多少个控件?我没有发现CF.Net的更新速度很慢。对话框是否有可能被重载并且可以使用子控件更快地自定义绘制?
  • 覆盖DialogResult属性和类的Dispose方法,以处理添加/重新转移等待游标。