UWP返回的视图模型值丢失了媒体元素



我有一个媒体元素,我正在尝试在按下后退时获得视频的位置。我已经将位置与视图模型相结合,当我从按钮按下时,我可以看到正确的值,但是当使用backEquested时,媒体元素的值是空的。所有其他值都是完整的。

我要做的是,当用户返回时,我想存储视频的位置,因此当用户希望的话,可以恢复视频时,可以恢复位置。

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        this.DataContext = new MediaPlayerVM(new NavigationService(), mainMovie);
        // Pass Parameter and Play Movie
        Play((TMDB_Movie)e.Parameter);
        mainMovie = (TMDB_Movie)e.Parameter;
        // Check for Hue Lights
        LightsAvailable();
        // tie my event with back action
        SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
    }

   private void OnBackRequested(object sender, BackRequestedEventArgs e)
    {
        Frame rootFrame = Window.Current.Content as Frame;
        if (rootFrame.CanGoBack)
        {
            e.Handled = true;
            MediaPlayerVM viewModel = (MediaPlayerVM)this.DataContext;
            // THESE VALUES ARE BLANK BUT NOT BLANK ON BUTTON PRESS
            var position = MediaPlayerElement.Position;
            var position1 = viewModel.Position;
            rootFrame.GoBack();
        }
    }

关于为什么会发生的任何想法,还是另一种方法?我不必在位置的绑定范围内更新我的数据库。好像杀死了

谢谢

我无法复制您的问题。通过在我身边进行测试,我可以在OnBackRequested事件句柄中正确获得MediaElement的位置,而不是null。我的测试应用程序目标版本是Build 15063,并且在模拟器OS构建15063上进行测试。这是我的测试代码片段。

xaml

 <MediaElement Source="ms-appx:///Assets/TrimmedClip3.mp4" x:Name="mediaelement"></MediaElement> 
 <Button x:Name="btngetposition" Click="btngetposition_Click" Content="get position"></Button>

代码背后:

 protected override void OnNavigatedTo(NavigationEventArgs e)
 {
     base.OnNavigatedTo(e);
     SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
 }
 private void OnBackRequested(object sender, BackRequestedEventArgs e)
 {
     Frame rootFrame = Window.Current.Content as Frame;
     if (rootFrame.CanGoBack)
     { 
         var mediaelementposition = mediaelement.Position;
     } 
 }
 private void btngetposition_Click(object sender, RoutedEventArgs e)
 {          
     var mediaelementposition = mediaelement.Position;
 }

请尝试创建一个带有以上简单代码的空白应用程序,以再次测试以缩小问题。您还可以尝试使用另一个设备进行测试以排除设备问题。

如果您仍然遇到问题,请提供您的测试环境和最少的复制项目。

解决了问题。我没有尝试在我的媒体播放器页面中处理onbackRequested,而是能够从app.cs

中的rootpage获取datacontext

希望这个解决方案可以节省其他时间。此方法放在app.cs文件

    private void OnBackRequested(object sender, BackRequestedEventArgs e)
    {
        SetTileBarColours();
        Frame rootFrame = Window.Current.Content as Frame;
        if (rootFrame.CanGoBack)
        {
            // Update Media Position on page leave from Media Player 
            if (rootFrame.SourcePageType.Name == "MediaPlayer")
            {
                MediaPlayer page = (MediaPlayer)rootFrame.Content;
                MediaPlayerVM viewModel = (MediaPlayerVM)page.DataContext;
                viewModel.SavePostion();
            }
            e.Handled = true;
            rootFrame.GoBack();
        }
    }

最新更新