如何通过C#寻找MediaPlayerElement
How to seek MediaPlayerElement through C#
我正在为 MediaPlayerElement
创建 CustomMediaTransportControls。在其中,我添加了一个新按钮,用于使用 CompactOverlay Mode 中当前正在播放的视频创建 window。我使用下面的代码完成了它。
//Button click event for CompactOverlayButton to Create a Frame in CompactOverlay mode
public async void CompactOverlayButton_ClickAsync(object sender, RoutedEventArgs e)
{
int compactViewId = ApplicationView.GetForCurrentView().Id; //Initializing compactViewId to the Current View ID
await CoreApplication.CreateNewView().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
var frame = new Frame();
compactViewId = ApplicationView.GetForCurrentView().Id;
frame.Navigate(typeof(VideoPlayerPage));
Window.Current.Content = frame;
Window.Current.Activate();
ApplicationView.GetForCurrentView().Title = "";
});
bool viewShown = await ApplicationViewSwitcher.TryShowAsViewModeAsync(compactViewId, ApplicationViewMode.CompactOverlay);
compactOverlayButton.Visibility = Visibility.Collapsed;
}
但一个问题是我想从用户单击 CompactOverlay 按钮的位置恢复视频。我该怎么做?
我认为您的问题的一种可能解决方案是使用 Navigate(TypeName, Object) method to pass the current playback position to your VideoPlayerPage
and in VideoPlayerPage
code-behind file, override the OnNavigatedTo 方法从当前播放位置恢复视频。
例如,假设当前页面中有两个名为 "mediaPlayerElement" 的 MediaPlayerElement
和 VideoPlayerPage
。在当前页面,我们可以将当前播放位置传给pass the current playback position
,如下:
//Get current playback position
var position = mediaPlayerElement.MediaPlayer.PlaybackSession.Position;
int compactViewId = 0;
await CoreApplication.CreateNewView().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
var frame = new Frame();
compactViewId = ApplicationView.GetForCurrentView().Id;
frame.Navigate(typeof(VideoPlayerPage), position);
Window.Current.Content = frame;
Window.Current.Activate();
ApplicationView.GetForCurrentView().Title = "";
});
bool viewShown = await ApplicationViewSwitcher.TryShowAsViewModeAsync(compactViewId, ApplicationViewMode.CompactOverlay);
然而,CompactOverlayButton_ClickAsync
是 CustomMediaTransportControls
中的一个函数,它是 MediaTransportControls 的派生 class。从这里我们无法得到 mediaPlayerElement
。所以我们需要在这里做一些修改。
在自定义传输控件中添加自定义命令按钮时,我们通常会使用public EventHandler
来执行单击按钮时发生的操作。有关详细信息,请参阅 Adding a custom button in Create custom transport controls.
在这种情况下,我们可以添加一个EventHandler
,例如:
public event EventHandler<EventArgs> CompactOverlaid;
...
//Button click event for CompactOverlayButton to Create a Frame in CompactOverlay mode
public void CompactOverlayButton_Click(object sender, RoutedEventArgs e)
{
CompactOverlaid?.Invoke(this, EventArgs.Empty);
compactOverlayButton.Visibility = Visibility.Collapsed;
}
并且在当前页面中,使用 CustomMediaTransportControls
如:
<local:CustomMediaTransportControls x:Name="CustomMediaControl" CompactOverlaid="CustomMediaControl_CompactOverlaid"/>
private async void CustomMediaControl_CompactOverlaid(object sender, EventArgs e)
{
//Get current playback position
var position = mediaPlayerElement.MediaPlayer.PlaybackSession.Position;
int compactViewId = 0;
await CoreApplication.CreateNewView().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
var frame = new Frame();
compactViewId = ApplicationView.GetForCurrentView().Id;
frame.Navigate(typeof(VideoPlayerPage), position);
Window.Current.Content = frame;
Window.Current.Activate();
ApplicationView.GetForCurrentView().Title = "";
});
bool viewShown = await ApplicationViewSwitcher.TryShowAsViewModeAsync(compactViewId, ApplicationViewMode.CompactOverlay);
}
然后在 VideoPlayerPage
代码隐藏文件中,重写 OnNavigatedTo 方法,如下所示:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
/// set media source
...
/// set media source
if (e.Parameter is TimeSpan position)
{
mediaPlayerElement.MediaPlayer.PlaybackSession.Position = position;
}
mediaPlayerElement.MediaPlayer.Play();
}
在此之后,视频应该可以从用户点击的位置播放 CompactOverlayButton
。
我正在为 MediaPlayerElement
创建 CustomMediaTransportControls。在其中,我添加了一个新按钮,用于使用 CompactOverlay Mode 中当前正在播放的视频创建 window。我使用下面的代码完成了它。
//Button click event for CompactOverlayButton to Create a Frame in CompactOverlay mode
public async void CompactOverlayButton_ClickAsync(object sender, RoutedEventArgs e)
{
int compactViewId = ApplicationView.GetForCurrentView().Id; //Initializing compactViewId to the Current View ID
await CoreApplication.CreateNewView().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
var frame = new Frame();
compactViewId = ApplicationView.GetForCurrentView().Id;
frame.Navigate(typeof(VideoPlayerPage));
Window.Current.Content = frame;
Window.Current.Activate();
ApplicationView.GetForCurrentView().Title = "";
});
bool viewShown = await ApplicationViewSwitcher.TryShowAsViewModeAsync(compactViewId, ApplicationViewMode.CompactOverlay);
compactOverlayButton.Visibility = Visibility.Collapsed;
}
但一个问题是我想从用户单击 CompactOverlay 按钮的位置恢复视频。我该怎么做?
我认为您的问题的一种可能解决方案是使用 Navigate(TypeName, Object) method to pass the current playback position to your VideoPlayerPage
and in VideoPlayerPage
code-behind file, override the OnNavigatedTo 方法从当前播放位置恢复视频。
例如,假设当前页面中有两个名为 "mediaPlayerElement" 的 MediaPlayerElement
和 VideoPlayerPage
。在当前页面,我们可以将当前播放位置传给pass the current playback position
,如下:
//Get current playback position
var position = mediaPlayerElement.MediaPlayer.PlaybackSession.Position;
int compactViewId = 0;
await CoreApplication.CreateNewView().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
var frame = new Frame();
compactViewId = ApplicationView.GetForCurrentView().Id;
frame.Navigate(typeof(VideoPlayerPage), position);
Window.Current.Content = frame;
Window.Current.Activate();
ApplicationView.GetForCurrentView().Title = "";
});
bool viewShown = await ApplicationViewSwitcher.TryShowAsViewModeAsync(compactViewId, ApplicationViewMode.CompactOverlay);
然而,CompactOverlayButton_ClickAsync
是 CustomMediaTransportControls
中的一个函数,它是 MediaTransportControls 的派生 class。从这里我们无法得到 mediaPlayerElement
。所以我们需要在这里做一些修改。
在自定义传输控件中添加自定义命令按钮时,我们通常会使用public EventHandler
来执行单击按钮时发生的操作。有关详细信息,请参阅 Adding a custom button in Create custom transport controls.
在这种情况下,我们可以添加一个EventHandler
,例如:
public event EventHandler<EventArgs> CompactOverlaid;
...
//Button click event for CompactOverlayButton to Create a Frame in CompactOverlay mode
public void CompactOverlayButton_Click(object sender, RoutedEventArgs e)
{
CompactOverlaid?.Invoke(this, EventArgs.Empty);
compactOverlayButton.Visibility = Visibility.Collapsed;
}
并且在当前页面中,使用 CustomMediaTransportControls
如:
<local:CustomMediaTransportControls x:Name="CustomMediaControl" CompactOverlaid="CustomMediaControl_CompactOverlaid"/>
private async void CustomMediaControl_CompactOverlaid(object sender, EventArgs e)
{
//Get current playback position
var position = mediaPlayerElement.MediaPlayer.PlaybackSession.Position;
int compactViewId = 0;
await CoreApplication.CreateNewView().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
var frame = new Frame();
compactViewId = ApplicationView.GetForCurrentView().Id;
frame.Navigate(typeof(VideoPlayerPage), position);
Window.Current.Content = frame;
Window.Current.Activate();
ApplicationView.GetForCurrentView().Title = "";
});
bool viewShown = await ApplicationViewSwitcher.TryShowAsViewModeAsync(compactViewId, ApplicationViewMode.CompactOverlay);
}
然后在 VideoPlayerPage
代码隐藏文件中,重写 OnNavigatedTo 方法,如下所示:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
/// set media source
...
/// set media source
if (e.Parameter is TimeSpan position)
{
mediaPlayerElement.MediaPlayer.PlaybackSession.Position = position;
}
mediaPlayerElement.MediaPlayer.Play();
}
在此之后,视频应该可以从用户点击的位置播放 CompactOverlayButton
。