2017-08-29 27 views
0

我有一個媒體元素,並且我試圖在按下後退時獲取視頻的位置。我已將位置綁定到ViewModel,當從按鈕按下時可以看到正確的值,但在使用BackRequested時,媒體元素的值爲空。所有其他值完好無損。UWP BackRequested查看模型媒體元素缺失的值

我想要做的是,當用戶點擊返回時,我想存儲視頻的位置,所以當視頻再次播放時,如果用戶希望可以恢復位置。

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的綁定中更新我的數據庫。好像過度殺人

謝謝

回答

0

我無法重現您的問題。通過在我身邊進行測試,我可以在OnBackRequested事件句柄內正確地獲取MediaElement的位置,而不是null。我的測試應用程序目標版本是建立15063,並在模擬器操作系統生成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; 
} 

請嘗試創建上面簡單的代碼空白的應用程序再次測試,以縮小您的問題。而且您還可以嘗試其他設備進行測試以排除設備問題。

如果您仍然有問題,請提供您的測試環境和最少的重現項目。

+0

我已經創建了一個示例項目並且它不會複製。我認爲目標和最小版本可能是一個問題,但在將其更改爲最新版本後,問題仍在發生。 我在示例項目中也使用了相同的代碼和元素屬性。 我不知道什麼可能導致這個,非常沮喪 –

+0

因此,我發現了這個問題,但它造成了另一個。 在我的App.cs中,我有一個OnBackRequested方法,如果我註釋掉代碼,我可以看到我的媒體播放器頁面中的位置OnBackRequested方法,但是我只想控制一個頁面的OnBackRequested方法並讓App.cs的OnBackRequested方法處理所有其他頁面。 這可能嗎? –

0

我解決了這個問題。我沒有試圖在我的媒體播放器頁面中處理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(); 
     } 
    }