Универсальная платформа Windows - пользовательский интерфейс не обновляется при возврате с другой страницы
Я изучаю универсальную платформу Windows и в настоящее время анализирую музыкальный проигрыватель с помощью SoundCloud API с этого сайта. Ссылка на проект github находится в самом низу страницы. Чтобы заставить этот проект работать, необходимо заполнить переменную SoundCloudClientId из App.xaml.cs (я использовал идентификатор клиента из предыдущего примера на той же странице, не уверен, смогу ли я вставить его).
Когда приложение запускается, загружается страница NowPlaying, а смена треков приводит к соответствующему обновлению пользовательского интерфейса. Проблема в том, что я перехожу на любую другую страницу и возвращаюсь к NowPlaying. Я все еще могу менять музыку с помощью кнопок, но пользовательский интерфейс не меняется (название песни, название альбома и т. Д.).
Важные части кода: NowPlaying.xaml
<ImageBrush x:Name="albumrtImage" ImageSource="Assets\Albumart.png" Stretch="UniformToFill" />
<TextBlock x:Name="txtSongTitle" Grid.Row="0" HorizontalAlignment="Center" Text="Song Title " FontSize="25" Foreground="White" Style="{StaticResource HeaderTextBlockStyle}" TextTrimming="WordEllipsis" />
<TextBlock x:Name="txtAlbumTitle" Grid.Row="0" Text="Label " HorizontalAlignment="Center" FontWeight="Light" FontSize="20" Foreground="#9799a5" Style="{StaticResource BodyTextBlockStyle}" TextTrimming="WordEllipsis"/>
NowPlaying.xaml.cs
async void BackgroundMediaPlayer_MessageReceivedFromBackground(object sender, MediaPlayerDataReceivedEventArgs e)
{
TrackChangedMessage trackChangedMessage;
if (MessageService.TryParseMessage(e.Data, out trackChangedMessage))
{
// When foreground app is active change track based on background message
await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
var songIndex = GetSongIndexById(trackChangedMessage.TrackId);
if (songIndex >= 0)
{
var song = App.likes[songIndex];
LoadTrack(song); //Update UI
}
});
return;
}
BackgroundAudioTaskStartedMessage backgroundAudioTaskStartedMessage;
if (MessageService.TryParseMessage(e.Data, out backgroundAudioTaskStartedMessage))
{
backgroundAudioTaskStarted.Set();
return;
}
}
private async void LoadTrack(SoundCloudTrack currentTrack)
{
try
{
//Change album art
string albumartImage = Convert.ToString(currentTrack.artwork_url);
if (string.IsNullOrWhiteSpace(albumartImage))
{
albumartImage = @"ms-appx:///Assets/Albumart.png";
}
else
{
albumartImage = albumartImage.Replace("-large", "-t500x500");
}
//Next 3 lines when pages were switched don't cause UI to update
albumrtImage.ImageSource = new BitmapImage(new Uri(albumartImage));
txtSongTitle.Text = currentTrack.title;
txtAlbumTitle.Text = Convert.ToString(currentTrack.user.username);
}
catch (Exception ex)
{
MessageDialog showMessgae = new MessageDialog("Something went wrong. Please try again. Error Details : " + ex.Message);
await showMessgae.ShowAsync();
}
}
После перехода из NowPlaying->Me->NowPlaying и нажатия кнопки Next дорожка изменится, но пользовательский интерфейс не обновится, как показано на экране ниже:
Проблема пользовательского интерфейса
Я пытаюсь воспроизвести проблему на простом примере, но безуспешно. Что может вызвать эту проблему? Любая помощь приветствуется.
2 ответа
Я просто хочу добавить, что вы также можете проверить режим навигации в методе OnNavigatedTo. Это может быть полезно, когда, например, вы хотите обновить данные при возврате на выбранную страницу.
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if(e.NavigationMode == NavigationMode.Back)
{
//refresh the data here...
}
}
Я нашел решение. Проблема была с кешем. Страница NowPlaying требует установки следующего свойства: NavigationCacheMode="Required"