上一篇鸟文中,老周通过史无前例的代码向各位 demo 了访问键的用法(即 Alt + 某某)。不过,大伙伴们一定会发现,访问键毕竟限制较大,不太灵活,也不好发挥,于是就需要自定义快捷键了。

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

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

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

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

要注意,这两个键盘事件出现在两个地方:

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

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

Part 1 :简单按键处理

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

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

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

随后,咱们实现的功能,用F1、F2、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 = ;
break;
case Windows.System.VirtualKey.F2:
lv.SelectedIndex = ;
break;
case Windows.System.VirtualKey.F3:
lv.SelectedIndex = ;
break;
case Windows.System.VirtualKey.F4:
lv.SelectedIndex = ;
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 字段获取。

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

【Windows 10 应用开发】自定义快捷键的更多相关文章

  1. Windows 10 IoT Serials 1 - 针对Minnow Board MAX的Windows 10 IoT开发环境搭建

    目前,微软针对Windows IoT计划支持的硬件包括树莓派2,Minnow Board MAX 和Galileo (Gen 1和Gen 2).其中,Galileo (Gen 1和Gen 2)运行的是 ...

  2. 打造理想的Windows 10 APP开发环境的5个步骤

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软即将发布Windows 10手机版,实际上很多人现在已经开始在开发Windows ...

  3. Windows 10 UWP开发:如何去掉ListView默认的选中效果

    原文:Windows 10 UWP开发:如何去掉ListView默认的选中效果 开发UWP的时候,很多人会碰到一个问题,就是ListView在被数据绑定之后经常有个默认选中的效果,就像这样: 而且它不 ...

  4. 张高兴的 Windows 10 IoT 开发笔记:使用 ADS1115 读取模拟信号

    考虑到 Raspberry Pi 读取模拟信号是很烦人的事情,更何况是在没人玩的 Windows 10 IoT 下,所以准备正儿八经的写点东西. 需求:使用 Raspberry Pi 读取输出模拟信号 ...

  5. 张高兴的 Windows 10 IoT 开发笔记:使用 Lightning 中的软件 PWM 驱动 RGB LED

    感觉又帮 Windows 10 IoT 开荒了,所以呢,正儿八经的写篇博客吧.其实大概半年前就想写的,那时候想做个基于 Windows 10 IoT 的小车,但树莓派原生不支持 PWM 啊.百度也搜不 ...

  6. 张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块

    HC-SR04 采用 IO 触发测距.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码. 1. 准备 H ...

  7. 张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器

    BH1750FVI 是一款 IIC 接口的数字型光强度传感器集成电路.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 ...

  8. 张高兴的 Windows 10 IoT 开发笔记:部署 ASP.NET Core 2 应用

    今天是大年初二,都去走亲戚了吧,享受一下这难得的能和亲友相聚的时光.而我就不一样了,今天一回到家就又开始瞎折腾了,哈哈哈. 问题背景 最近花了点时间用 ASP.NET Core 2 写了个个人博客,中 ...

  9. 张高兴的 Windows 10 IoT 开发笔记:串口红外编解码模块 YS-IRTM

    This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub: https://github.c ...

随机推荐

  1. 基于Struts2,Spring4,Hibernate4框架的系统架构设计与示例系统实现

    笔者在大学中迷迷糊糊地度过了四年的光景,心中有那么一点目标,但总感觉找不到发力的方向. 在四年间,尝试写过代码结构糟糕,没有意义的课程设计,尝试捣鼓过Android开发,尝试探索过软件工程在实际开发中 ...

  2. xmlplus 组件设计系列之十 - 网格(DataGrid)

    这一章我们要实现是一个网格组件,该组件除了最基本的数据展示功能外,还提供排序以及数据过滤功能. 数据源 为了测试我们即将编写好网格组件,我们采用如下格式的数据源.此数据源包含两部分的内容,分别是表头数 ...

  3. [刷题]算法竞赛入门经典 3-7/UVa1368 3-8/UVa202 3-9/UVa10340

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 都是<算法竞赛入门经典(第二版)>的题目,标题上没写(第二版) 题目:算法竞赛入门经典 3-7/UVa13 ...

  4. Nginx安装lua支持

    Nginx安装lua支持 需要LuaJIT-2.0.4.tar.gz,ngx_devel_kit,lua-nginx-module 1.下载安装LuaJIT-2.0.4.tar.gz wget -c ...

  5. WPF学习随笔

    内容控件 Padding内边距,Margin外边距 1.ScrollViewer滚动条控件 <ScrollViewer VerticalScrollBarVisibility="Vis ...

  6. numpy之索引和切片

    索引和切片 一维数组 一维数组很简单,基本和列表一致. 它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改). 这也意味着,如果不想更改原始数组,我们需要进行显式的复制 ...

  7. JVM学习笔记二:JVM参数

    所有线程共享的内存主要有两块:堆内存和方法区. 其中堆内存分为两块:新生代Young generation(Eden区.From Survivor区.To Survivor区).老年代Tenured ...

  8. Cassandra Issue with Tombstone

    1. Cassandra is quicker than postgre and have lower change to lose data. Cassandra doesn't have fore ...

  9. Bitwise And Queries

    Bitwise And Queries Time limit: 1500 msMemory limit: 128 MB You are given QQ queries of the form a\ ...

  10. Spring Boot 声明式事务结合相关拦截器

    我这项目的读写分离方式在使用ThreadLocal实现的读写分离在迁移后的偶发错误里提了,我不再说一次了,这次是有要求读写分离与事务部分要完全脱离配置文件,程序员折腾了很久,于是我就查了一下,由于我还 ...