繁体   English   中英

UWP MediaPlayerElement键盘事件

[英]UWP MediaPlayerElement Keyboard events

我正在制作一个带有媒体播放器元素的UWP程序。 我的代码如下:

XAML

<Grid>
    <Grid.Background>
        <SolidColorBrush Color="#FF000000"/>
    </Grid.Background>
    <MediaPlayerElement x:Name="Player" 
                        Stretch="Uniform"
                        AreTransportControlsEnabled ="True"
                        AutoPlay="True"
                        IsHoldingEnabled="False" 
                        IsRightTapEnabled="False">
        <MediaPlayerElement.TransportControls>
            <MediaTransportControls IsZoomButtonVisible="False" IsZoomEnabled="False" KeyDown="MediaTransportControls_KeyDown" RequiresPointer="WhenEngaged" />
        </MediaPlayerElement.TransportControls>
    </MediaPlayerElement>
    <ProgressRing x:Name="EpisodeProgress" HorizontalAlignment="Center" VerticalAlignment="Center" Height="80" Width="80"/>
</Grid>

C#:

public sealed partial class Media_Player : Page
{

    public Media_Player()
    {
        this.InitializeComponent();

        Player.TransportControls.DoubleTapped += SingleMediaElement_DoubleTapped;
    }

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {


        SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
        EpisodeProgress.IsActive = true;
        Uri source = new Uri("https://mediaplatstorage1.blob.core.windows.net/windows-universal-samples-media/sintel_trailer-480p.mp4");
        Player.Source = MediaSource.CreateFromUri(source);
        EpisodeProgress.IsActive = false;
        Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
    }

    private void CoreWindow_KeyDown(CoreWindow sender, KeyEventArgs args)
    {
        if (args.VirtualKey == Windows.System.VirtualKey.Space)
        {
            if (Player.MediaPlayer.PlaybackSession.PlaybackState == Windows.Media.Playback.MediaPlaybackState.Playing)
            {
                Player.MediaPlayer.Pause();
            }
            else if (Player.MediaPlayer.PlaybackSession.PlaybackState == Windows.Media.Playback.MediaPlaybackState.Paused)
            {
                Player.MediaPlayer.Play();
            }
        }
    }

    private void SingleMediaElement_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
    {
        var view = ApplicationView.GetForCurrentView();

        if (view.IsFullScreenMode)
            view.ExitFullScreenMode();
        else
            view.TryEnterFullScreenMode();
    }
}

所以我想做的是使用KeyDown事件使用键盘上的空格键暂停/播放视频。 附加此活动的最佳地点是什么? 在某些情况下,将其附加到“核心窗口”仍然只能工作,因为在全屏模式下,事件由于某种原因会触发两次。 同样,在当前设置中附加了该事件后,双击事件也不会再触发。 在添加Key处理程序之前,两次轻按即可正常工作。 我在做什么错?我应该在哪里附加事件以在全屏和全屏模式下监听键?

谢谢!

MediaPlayerElement处于全窗口模式下时,空格键已经具有默认行为,即按下该键将暂停/播放不需要控制它的视频。 因此,您可以仅将按键事件附加到核心窗口,然后添加条件以判断播放器是否处于全窗口模式,然后确定是否执行自定义按键事件。 否则,您的自定义行为和默认行为将导致两次触发事件。 更新了CoreWindow_KeyDown代码,如下所示。

private void CoreWindow_KeyDown(CoreWindow sender, KeyEventArgs args)
{
    if (args.VirtualKey == Windows.System.VirtualKey.Space && !Player.IsFullWindow)
    {
        if (Player.MediaPlayer.PlaybackSession.PlaybackState == Windows.Media.Playback.MediaPlaybackState.Playing)
        {
            Player.MediaPlayer.Pause();
        }
        else if (Player.MediaPlayer.PlaybackSession.PlaybackState == Windows.Media.Playback.MediaPlaybackState.Paused)
        {
            Player.MediaPlayer.Play();
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM