Вы можете использовать Cursor.Current
.
// Set cursor as hourglass
Cursor.Current = Cursors.WaitCursor;
// Execute your time-intensive hashing code here...
// Set cursor as default arrow
Cursor.Current = Cursors.Default;
Однако, если операция хеширования действительно длительная (MSDN определяет это как более 2-7 секунд), вам, вероятно, следует использовать визуальный индикатор обратной связи, кроме курсора, чтобы уведомить пользователя о ходе выполнения. Более подробный набор рекомендаций см. В этой статье .
Редактировать:
Как отметил @Am, вам может потребоваться позвонить Application.DoEvents();
после, Cursor.Current = Cursors.WaitCursor;
чтобы убедиться, что песочные часы действительно отображаются.
Application.UseWaitCursor = true
иApplication.UseWaitCursor = false
Фактически,
временно устанавливает курсор ожидания, но не гарантирует, что курсор ожидания будет отображаться до конца вашей операции. Другие программы или элементы управления в вашей программе могут легко сбросить курсор обратно на стрелку по умолчанию, как на самом деле происходит, когда вы перемещаете мышь во время работы.
Гораздо лучший способ показать курсор ожидания - установить для свойства UseWaitCursor в форме значение true:
Будет отображаться курсор ожидания для всех элементов управления в форме, пока вы не установите для этого свойства значение false. Если вы хотите, чтобы курсор ожидания отображался на уровне приложения, вы должны использовать:
источник
Основываясь на предыдущем, мой предпочтительный подход (так как это часто выполняемое действие) заключается в том, чтобы заключить код курсора ожидания в вспомогательный класс IDisposable, чтобы его можно было использовать с помощью () (одна строка кода), принять необязательные параметры, выполнить код внутри, а затем очистить (восстановить курсор).
Использование:
источник
Использовать UseWaitCursor проще на уровне формы или окна. Типичный вариант использования может выглядеть следующим образом:
Для лучшего пользовательского интерфейса вы должны использовать асинхронность из другого потока.
источник
Мой подход заключается в том, чтобы сделать все вычисления в фоновом режиме.
Затем измените курсор следующим образом:
И в событии окончания потока восстановите курсор:
Обратите внимание, что это также может быть сделано для определенных элементов управления, поэтому курсор будет песочными часами только тогда, когда мышь находится над ними.
источник
Итак, я создал статический асинхронный метод. Это отключило элемент управления, который запускает действие и изменяет курсор приложения. Он запускает действие как задачу и ожидает завершения. Контроль возвращается к вызывающей стороне, пока он ждет. Таким образом, приложение остается отзывчивым, даже когда значок «занят» вращается.
Вот код формы основной формы
Мне пришлось использовать отдельный регистратор для фиктивного действия (я использую Nlog), и мой основной регистратор пишет в пользовательский интерфейс (расширенное текстовое поле). Мне не удалось отобразить курсор занятости только при нахождении над конкретным контейнером в форме (но я не очень старался). Все элементы управления имеют свойство UseWaitCursor, но, похоже, это не влияет на элементы управления. Я пытался (возможно, потому что они не были на вершине?)
Вот основной журнал, который показывает, что происходит в том порядке, в котором мы ожидаем:
источник
С классом ниже вы можете сделать предложение о пончик "исключение безопасно".
класс CursorHandler
источник
Окей, мнение других людей очень ясно, но я хотел бы сделать некоторые из них, как следует:
источник
Для приложений Windows Forms может быть полезно дополнительное отключение UI-Control. Итак, мое предложение выглядит так:
Использование:
источник
Используйте это с WPF:
источник