【Windows 10 应用开发】自定义快捷键

上一篇鸟文中,老周经过前所未有的代码向各位 demo 了访问键的用法(即 Alt + 某某)。不过,大伙伴们必定会发现,访问键毕竟限制较大,不太灵活,也很差发挥,因而就须要自定义快捷键了。编程

其实,自定义快捷键也不是什么很玄的东西,老周向来不喜欢故弄玄虚,说白了嘛,就是对键盘事件的处理。UWP 与 WPF 有类似处,但也有差别。这些差别是不影响我们编程的,要是有些差别你就以为有困难了,那证实你的编程水平实在太差,赶忙回家给党组织写 10 份 800000 字的反省。ide

既然是键盘事件了,你首先闭上眼睛,一边养神一边想一想,键盘事件会涉及到什么关联的数据呢。首先,程序必须知道哪一个键被操做了,是吧,而每一个键都有内置的码位的,如虚键码,这个好办,Windows.System.VirtualKey 枚举已经为咱们定义好了,因此这个你没必要烦心;接着,咱们会想到,一个键会有啥操做呢?是了,无非就是按下和松开,即 Key Down和Key Up。spa

只要以上问题你想通了,那事情就很好弄了,比吃栗子还简单。code

 

UWP的SDK 给咱们准备了两个键盘事件:KeyDown在键被按下时发生,KeyUp在键弹起时发生。至于要处理哪一个事件,或者是否两个都处理,那就看你要作什么了。orm

要注意,这两个键盘事件出如今两个地方:对象

一、UIElement 类公开了这两个事件,这是用于处理用户界面上的元素的键盘行为的,但不包括当前窗口。blog

二、要在当前窗口层面上处理键盘事件,就要用到 CoreWindow 类,该类也公开这两个键盘事件。调用 GetForCurrentThread 静态方法,能够获取到当前窗口的实例。事件

 

Part 1 :简单按键处理

所谓简单按键,就是只按一个键的快捷键。这里我用一例子来演示。图片

界面上有一个 ListView 控件,里面有四个选项,XAML 以下。ip

        <ListView Name="lv" Margin="13">
            <ListViewItem>飞机</ListViewItem>
            <ListViewItem>火车</ListViewItem>
            <ListViewItem>自行车</ListViewItem>
            <ListViewItem>公交车</ListViewItem>
        </ListView>

随后,我们实现的功能,用F一、F二、F3 和 F4 四个键分别表明选中上面列表控件中的项。如F1选中第一项,F2选中第二项等。

此处,老周选用 CoreWindow 类,即该快捷键是能够在当前窗口范围内捕捉的。

        CoreWindow coreWind = null;
        ……
        coreWind = CoreWindow.GetForCurrentThread();
         coreWind.KeyDown += OnWindowKeyDown;

        ……
        private void OnWindowKeyDown(CoreWindow sender, KeyEventArgs args)
        {
            switch (args.VirtualKey)
            {
                case Windows.System.VirtualKey.F1:
                    lv.SelectedIndex = 0;
                    break;
                case Windows.System.VirtualKey.F2:
                    lv.SelectedIndex = 1;
                    break;
                case Windows.System.VirtualKey.F3:
                    lv.SelectedIndex = 2;
                    break;
                case Windows.System.VirtualKey.F4:
                    lv.SelectedIndex = 3;
                    break;
            }
        }

上面代码很好懂,此处就不解释了,节省600个字。

 

Part 2 :复合快捷键处理

所谓复合快捷键,就是同时按下两个或两个以上的键,我们少说P话,仍是经过实例来讲明吧。这个例子是这样的:在页面上使用 Image 控件显示一张图片,而后,按下【 Ctrl + 加号】来放大图像,按【Ctrl + 减号】来缩小图像。

其中主要的 XAML 以下。

        <Image Source="Assets\1.jpg" Margin="6" RenderTransformOrigin="0.5,0.5" >
            <Image.RenderTransform>
                <ScaleTransform x:Name="scl" ScaleX="1.0" ScaleY="1.0"/>
            </Image.RenderTransform>
        </Image>

因为 Image 控件不能接收键盘输入焦点,元素KeyDown和KeyUp事件不能响应,仍是考虑用CoreWindow类上的事件。

        CoreWindow coreWind = null;
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            coreWind = CoreWindow.GetForCurrentThread();
            coreWind.KeyDown += OnKeydown;
            coreWind.KeyUp += OnKeyup;
        }

这里要特特意声明一个bool类型的变量,用来表示Ctrl键是否按下。

bool Ctrl_down = false;

若是你不想用变量来标志Ctrl键是否按下,也能够访问 CoreWindow 对象的 GetKeyState(Windows.System.VirtualKey) 方法,来检查一下Ctrl 键是否已经按下。不过,老周认这仍是直接声明一个变量来保存按键状态更简单。

在KeyUp事件处理中,若是Ctrl键弹起,就让Ctrl_down变量改成 false。

        private void OnKeyup(CoreWindow sender, KeyEventArgs e)
        {
            if (e.VirtualKey == VirtualKey.Control)
            {
                Ctrl_down = false;
            }
        }

在 KeyDown 事件中,分两种情形:a、若是按下的是Ctrl键,就把变量Ctrl_down变量改成 true;b、若是Ctrl键已按下,而且还按了其余键,就要判断一下,是否是按了加号键或减号键。加号键就放大图像,减号键就缩小图像。

        private void OnKeydown(CoreWindow sender, KeyEventArgs e)
        {
            if (e.VirtualKey == VirtualKey.Control)
            {
                Ctrl_down = true;
                return;
            }

            // 进行缩放处理
            if (Ctrl_down)
            {
                switch (e.VirtualKey)
                {
                    case VirtualKey.Add:
                        if (scl.ScaleX < 5.0) scl.ScaleX += 0.2;
                        if (scl.ScaleY < 5.0) scl.ScaleY += 0.2;
                        break;
                    case VirtualKey.Subtract:
                        if (scl.ScaleX > 0.3) scl.ScaleX -= 0.2;
                        if (scl.ScaleY > 0.3) scl.ScaleY -= 0.2;
                        break;
                }
            }
        }

如今运行示例,而后本身按【Ctrl + (+)】和【Ctrl + (-)】键试试。

 

请各位严重注意一下:Key 事件并不记录 Alt 键,该键在 VirtualKey 枚举中用 Menu 表示,这家伙比较另类。它能够从表示按键状态的 CorePhysicalKeyStatus 结构的 IsMenuKeyDown 字段获取。

 

本文两个示例源代码的下载地址

相关文章
相关标签/搜索