我有一个媒体元素,我正在尝试在按下后退时获得视频的位置。我已经将位置与视图模型相结合,当我从按钮按下时,我可以看到正确的值,但是当使用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();
}
}