Проблема песочных часов в приложении WinForm

В моей программе с пользовательским интерфейсом в WinForm. Я установил курсор на песочные часы перед запуском метода в ThreadPool.

Мой код в потоке пользовательского интерфейса для установки курсора выглядит следующим образом:

Application.UseWaitCursor = true;

Когда метод закончен, я вернусь к потоку пользовательского интерфейса, чтобы установить курсор в нормальный случай.

Application.UseWaitCursor = false;

Моя проблема заключается в том, что курсор остается в Песочных очках, пока я не двигаю мышью. Это немного беспокоит, если пользователь ждет в конце действия без перемещения мыши.

Кто-нибудь может мне помочь?

Жером

Ответы

Ответ 1

Я не могу воспроизвести это поведение? Это отлично работает для меня.

Следует отметить одно, но если вы используете подход Control.Cursor = Cursors.WaitCursor, это обычно используется так:

this.Cursor = Cursors.WaitCursor

Что бы работать нормально, однако this ссылается на форму, поэтому, если пользователь перемещает мышь на другой элемент управления, например TextBox, тогда мышь не отображает курсор ожидания.

Это может вызвать путаницу для пользователей. Или может возникнуть ряд проблем, если пользователь продолжает работать над чем-то другим, когда приложение занято другой работой.

Ответ 2

Собственно, есть еще один способ сделать это, и я нашел где-то после нескольких часов исследования этой проблемы.

К сожалению, это взлом.

Ниже приведен метод, который я написал, который обрабатывает проблему.

/// <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 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;
    }

Ответ 3

Еще один способ:

Cursor.Current = Cursors.WaitCursor;

По завершении просто измените курсор назад:

Cursor.Current = Cursors.Default;

Ответ 4

Установите курсор вручную. Это то, что я делаю.