枚举:Key与ModifierKeys

来源:互联网 发布:js style.left无效 编辑:程序博客网 时间:2024/05/16 14:47

       枚举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键被按下。)
若要判断只有某修改键被按下,更为简单,只要判别则KeyBoard.Modifers的值即可:

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)
{
   bool shiftDown = KeyBoard.Modifers & ModifierKeys.Shift == ModifierKeys.Shift;
   if((e.Key < Key.D0) || (e.Key > Key.Z) && (e.Key < Key.Multiply))
   {
       return;
   }
   if(e.Key > Key.D9)
   {
       e.Handler = true;
   }
   else if(shiftDown)
   {
       e.Handler = true;
   }
}