【问题标题】:How to seek MediaPlayerElement through C#如何通过 C# 寻找 MediaPlayerElement
【发布时间】:2017-04-27 10:37:25
【问题描述】:

我正在为MediaPlayerElement 创建一个 CustomMediaTransportControls。在其中,我添加了一个新按钮来创建一个带有CompactOverlay Mode 中当前正在播放的视频的窗口。我已经使用下面的代码完成了。

//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 按钮的位置恢复视频。我该怎么做?

【问题讨论】:

    标签: c# xaml uwp win-universal-app


    【解决方案1】:

    我认为解决您的问题的一种可能方法是使用Navigate(TypeName, Object) 方法将当前播放位置传递给您的VideoPlayerPage 并在VideoPlayerPage 代码隐藏文件中覆盖OnNavigatedTo 方法以从当前恢复视频播放位置。

    例如,假设当前页面中有两个名为“mediaPlayerElement”的MediaPlayerElementVideoPlayerPage。在当前页面中,我们可以将当前播放位置传递给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_ClickAsyncCustomMediaTransportControls 中的一个函数,它是MediaTransportControls 的派生类。在这里表格我们无法获得mediaPlayerElement。所以我们需要在这里做一些修改。

    在自定义传输控件中添加自定义命令按钮时,我们通常会使用公共EventHandler 来执行单击按钮时发生的操作。更多信息,请参阅Create custom transport controls中的Adding a custom button

    在这种情况下,我们可以添加一个EventHandler like:

    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的位置开始播放。

    【讨论】:

    • CompactOverlayButton_ClickAsyncCustomMediaTransportControls 中的一个函数,它是MediaTransportControls 的派生类。它不是当前页面代码背后的功能。那么我该如何使用它呢?希望你能理解。
    • @VijayNirmal 没有注意到您的CompactOverlayButton_ClickAsync 在您的CustomMediaTransportControls 中。我已经更新了我的答案,请检查一下。
    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 2011-07-12
    • 2020-09-06
    • 1970-01-01
    • 2014-08-09
    相关资源
    最近更新 更多