.Net CF Предотвращает чрезмерное, нетерпеливое нажатие (во время перерисовки экрана)
-
03-07-2019 - |
Вопрос
Компактный фреймворк .Net
Сценарий:Пользователь находится на экране.Устройство не может найти принтер и спрашивает пользователя, не хочет ли он повторить попытку.Если они нажимают "Нет", текущий экран закрывается, и они возвращаются на экран родительского меню.Если они нажмут кнопку "Нет" несколько раз, первое нажатие будет использовано кнопкой "Нет", а следующее нажатие вступит в силу после завершения перерисовки экрана.(Фактически щелчок по пункту меню, который затем переводит пользователя на другой экран.)
Я не вижу подходящего места для установки курсора ожидания ... когда пользователь нажимает "Нет", ничего особенного не происходит, кроме закрытия формы.Но фреймворк CF медленно перерисовывает экран.
Есть какие-нибудь идеи?
Решение
Случайные мысли:
- Отключите некоторые элементы управления в родительском диалоговом окне, пока открыто модальное диалоговое окно.Я не верю, что вы можете отключить всю форму целиком, поскольку она является родительской для модального диалогового окна.
- В качестве альтернативы я бы предложил использовать прозрачный элемент управления для отслеживания кликов, но прозрачность в CF не поддерживается.
- Сколько элементов управления находится в родительском диалоговом окне?Я не нашел CF.Сеть, которая медленно обновляется.Есть ли какой-либо шанс, что диалоговое окно перегружено и может быть отрисовано на заказ быстрее, чем с вспомогательными элементами управления?
- переопределите свойство 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);
}
}
}
Вы можете убедиться, что это работает на следующем примере (консоль выводит click только в том случае, если 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, ...).
С уважением, тамберг