Отображение ProgressRing для вызова метода Sync (или выполнение асинхронного метода синхронизации) - PullRequest
0 голосов
/ 11 октября 2019

У меня есть приложение UWP, которое отображает кадры GIF и позволяет пользователю добавлять и удалять кадры. GIF повторно вычисляется такими действиями и отображается пользователю на той же странице, что и кнопки «добавить кадры» и «удалить кадры».

Процесс удаления кадров может занять некоторое время. В течение этого времени страница / окно зависает, и пользователь ничего не может сделать, но это еще не указывает ему на это.

Я думал об использовании ProgressRing, который запускается, когда пользователь нажимает «Удалить кадры». Кнопка, индикатор выполнения должен исчезнуть после длительной операции.

Поэтому я добавил это в конец страницы:

<ProgressRing x:Name="PrgrMain" />

И метод нажатия кнопки выглядит следующим образом:

private void BtnRemoveSelectedFrame_Click(object sender, RoutedEventArgs e)
{
    if (LvGifFrames.SelectedItems != null)
    {
        PrgrMain.IsActive = true;
        GifInformation.RemoveFrames(LvGifFrames.SelectedItems.Cast<GifFrameInformation>().ToList());
        PrgrMain.IsActive = false;
    }
}

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

private async void BtnRemoveSelectedFrame_Click(object sender, RoutedEventArgs e)
{
    if (LvGifFrames.SelectedItems != null)
    {
        PrgrMain.IsActive = true;
        await Task.Delay(5000);
        PrgrMain.IsActive = false;
    }
}

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

Я пытался инкапсулировать мои «RemoveFrames»код внутри Task.Run () и выполнение асинхронного метода с этим, но это привело к ошибке, что был вызван интерфейс, который был назначен для другого потока. Я также сомневаюсь, что это чистый подход, но я не уверен, куда идти.

Есть идеи?

1 Ответ

0 голосов
/ 14 октября 2019

Вы можете использовать контроль загрузки Windows Community Toolkit в качестве индикатора занятости своей страницы. https://docs.microsoft.com/en-us/windows/communitytoolkit/controls/loading

...