Как отобразить курсор ожидания в пользовательском интерфейсе во время работы фонового потока - PullRequest
0 голосов
/ 08 января 2020

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

Пожалуйста, кто-нибудь поделится вашим предложением, как показать курсор ожидания во время фонового потока?

private void Button_Click(object sender, RoutedEventArgs e)
        {

System.Threading.Thread thread = new System.Threading.Thread(() =>
            {
                this.Dispatcher.Invoke((Action)(() =>
                {
                    this.Cursor= Cursors.Wait;
                }));
            });
            thread.SetApartmentState(ApartmentState.STA);
            thread.IsBackground = false;
            thread.Start();
            System.Threading.Thread.Sleep(3000);
}

1 Ответ

0 голосов
/ 11 января 2020

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

возможно сделать это:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    try
    {
        Mouse.OverrideCursor = Cursors.Wait;
        await Task.Run(() => LoadWindow());
    }
    finally
    {
        Mouse.OverrideCursor = null;
    }
}

Но тогда пользовательский интерфейс остается отзывчивым - что противоречит использованию вами курсора ожидания.

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

Я использую несколько помощников для этого:

internal static void ShowWithWaitCursor(this Window view)
{
    WithWaitCursor(() => view.Show());
}

internal static void WithWaitCursor(Action action)
{
    Func<int> func = () => { action.Invoke(); return 0; };
    WithWaitCursor<int>(func);
}

internal static T WithWaitCursor<T>(Func<T> func)
{
    try
    {
        Mouse.OverrideCursor = Cursors.Wait;
        return func.Invoke();
    }
    finally
    {
        Mouse.OverrideCursor = null;
    }
}

Откройте окно:

Window win = new MyWindow();
win.DataContext = new MyViewModel(injectDependencies);
win.ShowWithWaitCursor();

Иногда ViewModel требуется некоторое время для загрузки так что я использую это:

Window win = new MyWindow();
win.DataContext = WindowHelpers.WithWaitCursor(() => new MyViewModel(injectDependencies));
win.ShowWithWaitCursor();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...