我有一个媒体元素,我试图在按下后面时获取视频的位置。我已经将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的绑定中更新我的数据库。好像过度杀人
谢谢
答案 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();
}
}