.Net CF предотвращает чрезмерное усердие, нетерпеливое нажатие (когда экран перерисовывается) - PullRequest
3 голосов
/ 30 сентября 2008

.Net Compact Framework

Сценарий: пользователь на экране. Устройство не может найти принтер и спрашивает пользователя, хотят ли они повторить попытку. Если они нажимают «Нет», текущий экран закрывается и они возвращаются на экран родительского меню. Если они нажимают кнопку «Нет» несколько раз, первый щелчок будет использоваться кнопкой «Нет», а следующий щелчок вступит в силу после завершения перерисовки экрана. (По сути, щелкнув пункт меню, который затем переместит пользователя на другой экран.)

Я не вижу подходящего места для размещения курсора ожидания ... когда пользователь нажимает "Нет", ничего особенного не происходит, кроме закрытия формы. Но фреймворк CF медленно перерисовывает экран.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 15 октября 2008

Вы можете пропустить ожидающие клики, очистив очередь сообщений 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, ...).

С уважением, Тамберг

2 голосов
/ 30 сентября 2008

Случайные мысли:

  • Отключить некоторые элементы управления в родительском диалоговом окне, пока модальное диалоговое окно включено. Я не верю, что вы можете отключить всю форму, так как она является родителем модального диалога.
  • В качестве альтернативы я бы предложил использовать прозрачный элемент управления для отлова кликов, но прозрачность не поддерживается в CF.
  • Сколько элементов управления в родительском диалоге? Я не нашел CF.Net, который медленно обновляется. Есть ли вероятность того, что диалоговое окно перегружено и может быть отрисовано на заказ быстрее, чем с субэлементами управления?
  • переопределяет свойство DialogResult и метод Dispose класса для обработки добавления / удаления курсора ожидания.
...