Проблема песочных часов в приложении WinForm
в моей программе с пользовательским интерфейсом в WinForm. Я установил курсор на песочные часы перед запуском метода в ThreadPool.
мой код в потоке пользовательского интерфейса для установки курсора выглядит так:
Application.UseWaitCursor = true;
когда метод завершен, я возвращаюсь к потоку пользовательского интерфейса, чтобы установить курсор в обычный случай.
Application.UseWaitCursor = false;
моя проблема заключается в том, что курсор остается в песочных часах, пока я не перемещаю мышь. Это немного беспокоит, если пользователь ждет в конце действия не двигая мышкой.
кто-нибудь может мне помочь ?
Джером
4 ответов
Я не могу воспроизвести такое поведение? Мне это подходит.
одна вещь, чтобы отметить, если вы используете Control.Cursor = Cursors.WaitCursor
подход заключается в том, что он обычно используется так:
this.Cursor = Cursors.WaitCursor
который, казалось бы, работает нормально, однако,this
ссылается на форму, поэтому, если пользователь перемещает мышь в другой элемент управления, e.g текстовое поле, после чего мышь не показывает курсор ожидания.
Это может вызвать путаницу для пользователей. Или может вызвать некоторые проблемы, если пользователь продолжает работать над чем-то еще, когда приложение занято другой работой.
на самом деле, есть еще один способ сделать это, который я нашел где-то после часов исследования этой проблемы.
к сожалению, это хак.
Ниже приведен метод, который я написал, который обрабатывает проблему.
/// <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;