【问题标题】:.Net CF Prevent Overzealous, Impatient Clicking (while screen is redrawing).Net CF 防止过度、不耐烦的点击(屏幕重绘时)
【发布时间】:2010-09-14 06:53:57
【问题描述】:

.Net Compact Framework

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

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

有什么想法吗?

【问题讨论】:

    标签: forms compact-framework refresh


    【解决方案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 将矩形区域粘合在一起。不是很漂亮。
    猜你喜欢
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多