Проблема песочных часов в приложении 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;

установите курсор вручную. Вот чем я занимаюсь.