Универсальная платформа 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 и нажатия кнопки «Далее» дорожка изменится, но пользовательский интерфейс не обновится, как показано на экране ниже:

проблема пользовательского интерфейса

Я пытаюсь воспроизвести проблему на простом примере, но безуспешно. Что может вызвать эту проблему? Любая помощь приветствуется.


person Krzysztof Błażełek    schedule 07.06.2016    source источник
comment
Откуда вы это называете? Видите ли вы какие-либо ошибки в выводе отладки? Пожалуйста, опубликуйте более полный пример или попробуйте найти минимально необходимый код для воспроизведения этой проблемы.   -  person Kai Brummund    schedule 07.06.2016
comment
В выводе отладки ошибок нет. Исходный код находится на веб-сайте, на который я ссылался выше, ссылка на github. Я попытаюсь воспроизвести проблему и опубликую ссылку ниже.   -  person Krzysztof Błażełek    schedule 07.06.2016
comment
Пожалуйста, не добавляйте решение вопроса или решение в заголовок. Опубликуйте решение как ответ.   -  person ChrisF    schedule 07.06.2016


Ответы (2)


Я нашел решение. Проблема была с кешем. На странице NowPlaying необходимо указать следующее свойство: NavigationCacheMode="Required"

person Krzysztof Błażełek    schedule 07.06.2016

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

 protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        if(e.NavigationMode == NavigationMode.Back)
        {
            //refresh the data here...
        }
    }
person Daniel Krzyczkowski    schedule 08.06.2016