Проблема песочных часов в приложении WinForm
-
01-10-2019 - |
Вопрос
В моей программе с UI в WinForm. Я установил курсор на песочные часы, прежде чем запустить метод в ThreadPool.
Мой код в потоке пользовательского интерфейса для установки курсора выглядит так:
Application.UseWaitCursor = true;
Когда метод закончен, я возвращаюсь к потоке пользовательского интерфейса для установки курсора в нормальный случай.
Application.UseWaitCursor = false;
Моя проблема - курсор остается в часовых часах, пока не двигаю мышь. Это немного беспокоит, если пользователь ждет до конца действия, не перемещая мышь.
Кто-нибудь может мне помочь?
Jérome.
Решение
Я не могу воспроизвести это поведение? Он отлично работает для меня.
Одна вещь, чтобы заметить, хотя, если вы используете Control.Cursor = Cursors.WaitCursor
Подход в том, что он обычно используется так:
this.Cursor = Cursors.WaitCursor
Который бы выглядел нормально, однако, однако, this
Относится к форме, поэтому, если пользователь перемещает мышь на другой элемент управления, например, текстовое поле, то мышь не показывает курсор ожидания.
Это может вызвать путаницу для пользователей. Или может привести к некоторым вопросам, если пользователь продолжает работать над чем-то еще, когда приложение занято, делая другую работу.
Другие советы
На самом деле, есть еще один способ сделать это, что я нашел где-то после работы по этой проблеме.
К сожалению, это хак.
Ниже приведен метод, который я писал, который обрабатывает проблему.
/// <summary>
/// Call to toggle between the current cursor and the wait cursor
/// </summary>
/// <param name="control">The calling control.</param>
/// <param name="toggleWaitCursorOn">True for wait cursor, false for default.</param>
public static void UseWaitCursor(this Control control, bool toggleWaitCursorOn)
{
...
control.UseWaitCursor = toggleWaitCursorOn;
// Because of a weird quirk in .NET, just setting UseWaitCursor to false does not work
// until the cursor's position changes. The following line of code fakes that and
// effectively forces the cursor to switch back from the wait cursor to default.
if (!toggleWaitCursorOn)
Cursor.Position = Cursor.Position;
}
Еще один способ:
Cursor.Current = Cursors.WaitCursor;
Когда закончите, просто измените курсор назад:
Cursor.Current = Cursors.Default;
Установите курсор вручную. Это то, чем я занимаюсь.