UWP BackRequested View模型缺少Media Element的值

时间:2017-08-29 19:18:17

标签: c# xaml uwp

我有一个媒体元素,我试图在按下后面时获取视频的位置。我已经将Position绑定到我的ViewModel,当我从按下按钮看时它可以看到正确的值,但是当使用BackRequested时,Media Element的值为空。所有其他值都完好无损。

我要做的是,当用户点击返回时,我想存储视频的位置,这样当再次播放视频时,如果用户愿意,可以恢复位置。

    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();
        }
    }

关于为什么会发生这种情况的想法或者可能是另一种方法?我不必在Position的绑定中更新我的数据库。好像过度杀人

谢谢

2 个答案:

答案 0 :(得分:0)

我无法重现您的问题。通过测试,我可以在OnBackRequested事件句柄中正确获取MediaElement的位置,而不是null。我的测试应用程序目标版本是build 15063,并在模拟器OS build 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;
 }

请尝试使用上述简单代码创建一个空白应用,以便再次测试以缩小您的问题范围。您还可以尝试使用其他设备进行测试,以排除设备问题。

如果您仍有问题,请提供您的测试环境和最小的重现项目。

答案 1 :(得分:0)

我解决了这个问题。我没有尝试在我的Media Player页面中处理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();
        }
    }