【问题标题】:Universal Windows Platform - UI not updating when returning from different page通用 Windows 平台 - 从不同页面返回时 UI 不更新
【发布时间】:2016-10-07 06:47:36
【问题描述】:

我正在学习通用 Windows 平台,目前正在使用来自 this 站点的 SoundCloud API 分析音乐播放器。 github 项目的链接位于页面的最底部。要使该项目正常工作,应填写来自 App.xaml.cs 的变量 SoundCloudClientId(我在同一页面上使用了上一个示例中的客户端 ID,不确定是否可以粘贴)。

当应用程序启动时,NowPlaying 页面被加载并且更改曲目会导致 UI 相应地更新。问题是当我导航到任何其他页面并返回到 NowPlaying 时。我仍然可以使用按钮更改音乐,但 UI 不会更改(歌曲标题、专辑标题等)。

代码的重要部分: 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 导航并单击下一步后,曲目更改,但 UI 未更新,如下面的屏幕所示:

UI problem

我试图在一个简单的例子中重现这个问题,但没有任何运气。什么可能导致这个问题?任何帮助表示赞赏。

【问题讨论】:

  • 你从哪里调用这个?您在调试输出中看到任何错误吗?请发布更完整的示例,或尝试找到重现此问题所需的最少代码。
  • 调试输出中没有错误。源代码在我上面链接的网站上,link to github。我将尝试重现该问题并在下面发布链接。
  • 请不要在问题中添加解决方案或在标题中添加“已解决”。发布解决方案作为答案。

标签: c# xaml win-universal-app uwp uwp-xaml


【解决方案1】:

我找到了解决方案。问题出在缓存上。 NowPlaying 页面需要放置以下属性: NavigationCacheMode="必需"

【讨论】:

    【解决方案2】:

    我只想补充一点,您还可以在 OnNavigatedTo 方法中检查导航模式。例如,当您希望在返回所选页面时刷新数据时,它会很有帮助。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多