WPF Overlay не активируется, пока кнопка не будет завершена - PullRequest
0 голосов
/ 29 мая 2020

У меня есть небольшой образец приложения WPF с использованием Caliburn Micro. В нем у меня есть прямоугольный оверлей с надписью «загрузка». Я хочу, чтобы это появлялось всякий раз, когда загружается большая задача, но это не появляется до тех пор, пока метод не будет завершен. Я пробовал использовать Dispatch, а также другие предложения, но ничего не работает, пока не будет завершен метод кнопки. Ниже мой текущий пример

  public async void TheActionButton()
        {
            //Application.Current.Dispatcher.Invoke(new System.Action(() => { IsLoadingMessageVisible = true; NotifyOfPropertyChange(() => IsLoadingMessageVisible); }));
            Execute.OnUIThread(new System.Action(() => { IsLoadingMessageVisible = true; NotifyOfPropertyChange(() => IsLoadingMessageVisible); }));
            await LongMethod();
        }

Оверлей появляется только после завершения работы LongMethod (). Есть ли способ показать его перед запуском метода?

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Вы не опубликовали реализацию LongMethod, поэтому невозможно сказать, что он на самом деле делает, но я предполагаю, что он не реализован как асинхронный и блокирует поток пользовательского интерфейса.

Вы может попытаться выполнить его в фоновом потоке, используя Task:

public async void TheActionButton()
{
    IsLoadingMessageVisible = true;
    NotifyOfPropertyChange(() => IsLoadingMessageVisible);
    await Task.Run(LongMethod);
}

Метод не является автоматически асинхронным только потому, что он возвращает Task или Task<T> и его можно ожидать.

1 голос
/ 29 мая 2020

Вы должны использовать TAP (асинхронное программирование на основе задач), он хорошо интегрируется с такими вариантами использования.

async void TheActionButton() 
{
    IsLoadingMessageVisible = true;
    NotifyOfPropertyChange(() => IsLoadingMessageVisible);

    await LongMethod();

    IsLoadingMessageVisible = false;
    NotifyOfPropertyChange(() => IsLoadingMessageVisible);
}

Примечание : реализуйте свой IsLoadingMessageVisible таким образом, чтобы что вам не нужно вызывать NotifyOfPropertyChange() каждый раз, когда вы устанавливаете свойство.

...