Универсальная платформа 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"

Другие вопросы по тегам