Проблема с песочными часами в приложении WinForm - PullRequest
13 голосов
/ 28 июня 2010

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

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

Application.UseWaitCursor = true;

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

Application.UseWaitCursor = false;

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

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

Jérôme

Ответы [ 4 ]

14 голосов
/ 06 января 2011

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

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

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

/// <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;
    }
13 голосов
/ 28 июня 2010

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

Cursor.Current = Cursors.WaitCursor;

Когда закончите, просто установите курсор назад:

Cursor.Current = Cursors.Default;
6 голосов
/ 28 июня 2010

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

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

this.Cursor = Cursors.WaitCursor

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

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

0 голосов
/ 28 июня 2010

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

...