У меня есть приложение 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 () и выполнение асинхронного метода с этим, но это привело к ошибке, что был вызван интерфейс, который был назначен для другого потока. Я также сомневаюсь, что это чистый подход, но я не уверен, куда идти.
Есть идеи?