枚举Key指定不特定于操作系统的可移植键代码。一般用于KeyDown和KeyUp事件的KeyEventArgs参数提供的Key值。(KeyEventArgs还包含以下属性,特定于操作系统的PlatformKeyCode,Handled和OriginalSource。) Key枚举是一般的枚举,尽管号称“简易而不简单”,用起来注重简单即可,无需深究太多。KEYNONE为0;1(BACKSPACE)到19(DELETE)是一些特殊键;DIGIT0到DIGIT9,20到29;A到Z,30到55;F1到F12,56到67;剩下的是小键盘从NUMPAD0到DIVIDE,68到82;最后是个KEYUNKOWN,255。 和Key枚举一样,在System.Windows.Input命名空间下,有一个KeyBoard类,这个类比较特殊,只有一个成员,是个属性,名称是Modifiers,返回值是ModifierKeys枚举。ModifierKeys枚举指定修改键集合,具有FlagsAttribute特性,即位标识,其成员值按位组合,每个都是2的某次方。ModifierKeys的定义大概如下: [FlagsAttribute]public enum ModifierKeys { None=0; //没有按下任何修饰符 Alt=1; //按下Alt键 Control=2; //按下Ctrl键 Shift=4; //按下Shift键 Windows=8; //按下Windows徽标键 Apple=8; //按下Apple键(与Windows键不会同时存在?没玩过Mac,不太清楚) } 所谓位标记,就是按照二进制来看,每个bit代表了一个值,每个值只有一位上是1。结合位运算的基本知识,可知某个值与其他值按位与(&)的结果都是0,而不同值之间的按位或则可代表这几种值的组合。 ModifierKeys.Shift & ModifierKeys.Control,即0010 & 0100 为 0;ModifierKeys.Shift | ModifierKeys.Control,即0010 | 0100为0110,代表两个键都按下。 而KeyBoard.Modifers代表目前所按下的修改键,若当前按下Shift键和Ctrl键,则KeyBoard.Modifers 的值为ModifierKeys.Shift | ModifierKeys.Shift。此时,KeyBoard.Modifers & ModifierKeys.Control 结果是 ModifierKeys.Control,即0110 & 0010 结果是 0010。因此可用来判断某键是否被按下,比如: bool shiftDown = KeyBoard.Modifers & ModifierKeys.Shift == ModifierKeys.Shift;bool shiftDown = KeyBoard.Modifers & ModifierKeys.Shift != 0; 若shiftDown为true,则表面Shift键被按下。(但并不一定是只有Shift键被按下。) bool onlyCtrlDown = KeyBoard.Modifers == ModifierKeys.Control; 举一反三,判断某对修改键组合被按下,判断只有这对修改键组合被按下。(略)
学习他人的代码,判断Ctrl键是否按下,这两者交替出现,搞得我不知道用哪个才好。要是有人讲解枚举时,拿Key和ModifierKeys做例子多么一举两得。 Silverlight文档:修改键始终生成自己的键事件,可以选择处理这些事件,也可以选择跟踪自己的修改键状态,(PS:一般是在KeyDown事件和KeyUp事件里放置一个自定义的bool标记符跟踪。)但用Modifiers通常更为方便。 附送一个在名称为tb的TextBox只能输入数字的代码片段,加深理解。 private void tb_KeyDown(object sender, KeyEventArgs e) |
枚举:Key与ModifierKeys
最新推荐文章于 2022-12-06 09:42:51 发布