【问题标题】:UWP MediaPlayerElement Keyboard eventsUWP MediaPlayerElement 键盘事件
【发布时间】:2016-12-09 11:18:12
【问题描述】:

我正在制作一个包含媒体播放器元素的 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 处理程序之前,双击运行良好。我做错了什么,我应该在哪里附加一个事件来监听窗口和全屏的键?

谢谢!

【问题讨论】:

    标签: c# uwp


    【解决方案1】:

    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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 2017-04-30
      • 1970-01-01
      相关资源
      最近更新 更多