管理键盘和鼠标输入事件

书名:WPF专业编程指南
作者:李应保
出版社:电子工业出版社
出版时间:2010-01
ISBN:9787121100116


一、管理键盘和鼠标输入事件

  • 人主要通过三种途径向个人计算机发出指令:键盘、鼠标和手写设备。
    键盘首先出现,然后是鼠标,现在手写设备、语音输入和虚拟输入开始普及.

  • 对应于这三种输入设备,WPF有三个类与之对应:Keyboard、Mouse和Stylus。
    当用户使用这三种输入设备时,WPF产生相应的传递事件在WPF元素树上传播。
    除了这三个专门的输入类之外,输入事件集中在WPF中的四大基类:UIElement、FrameworkElement、ContentElement、FrameworkContentElement中进行处理。

1 键盘输入

  • 键盘是较早的输入设备,从前面的例子,可以看出,键盘事件是一种传递事件,它可以沿着WPF中的元素树向树根(Bubble)或树枝传递(Tunnel)。

  • WPF中的传递事件采用一种开放式架构,在UIElement和ContentElement中都可以附加传递事件。
    这两个类是WPF大多UI元素的基类,所以传递事件可以附加到任何WPF的控件中。
    所有与键盘相关的事件都定义在Keyboard类中;所有与鼠标相关的事件都定义在Mouse类中;所有与手写输入相关的事件都定于在Stylus类中。
    这些传递事件都是以附加事件的形式存在,将来一旦有新的输入设备出现,WPF只要创建一个新的类,并在这个类中定义相应的附加事件,然后就可以附加到所有控件上,这样可以很容易地支持新的输入设备。

  • Keyboard类中所定义的传递事件如表7-2所示。


    表7-2 Keyboard类中所移植的附加事件
  • 当在键盘上按下一个键时,总有某个应用程序中的某个元素获得输入消息,这个消息被WPF翻译成传递事件,然后在元素树中传播。
    当按下Tab键,或者用鼠标单击某个图形元素时,键盘的输入焦点在图形元素间移动。
    当同时按下“Alt”和Tab键时,可以在不同的应用程序间切换。
    幸运的是,你切换不同的应用程序,应用程序会自动记住你的输入焦点,这样,当你切换回原来的应用程序时,自动回到原来的输入焦点。

2 鼠标输入

  • 就像键盘输入传递事件是在Keyboard类中移植的一样,鼠标输入也有一个专门的类Mouse。表7-3列出了Mouse类中移植的传递事件,这些传递事件都可以附加到任何UI元素上。

俘获鼠标

  • 所谓俘获鼠标是指在应用程序中设置鼠标的一种状态,这时哪怕是光标离开了应用程序的窗口,应用程序仍然可以接收到鼠标的信息。
    与之相反的操作就是释放鼠标,这种功能对于开发拖放功能非常有用。

  • 在WPF中俘获和释放鼠标非常简单,一种方法是调用UIElement类中的CaptureMouse()和ReleaseCaptureMouse()方法。另一种方法是调用Mouse类中的静态Capture方法。
    使用第一种方法的前提是UIElement类要在你的类的继承树上,多数需要捕获鼠标的元素都是从UIElement的派生类。


    表7-3 Mouse类中所支持的附加事件

输入焦点

  • WPF支持丰富的用户界面,某个呈现在用户面前的图形可能是由多个元素组合而成的。
    当这些元素前后叠加时,究竟是哪个元素得到了输入焦点?
    在二维图形元素当中通常是在最上面的元素获得输入焦点,然而,有时候希望某个图形的下面的元素获得输入焦点。
    比如,要在界面上展现一个盒子,盒子里放着红色、白色和黑色的小球,希望当用户把盒子的盖子打开的时候,用户可以用鼠标操作把其中的小球一个一个地取出来。在这种情况下,小球在界面上不是处在最上面的位置,要用鼠标把小球取出来的第一项工作就是小球要能够获得输入焦点。
    WPF的解决方法是若在绘制元素时的画刷不是空的(null),那么图形元素就可以获得输入焦点。
    若绘制图形时所用的画刷是空的,那么该图形就不能获得输入焦点,而是他下面的其他元素获得了输入焦点。
    对于上面的问题,只要把位于小球前方的图形元素的画刷设为空即可。

鼠标经过元素

  • 当多个图形元素叠加在界面上,当鼠标在界面上移动的时候,可能多个元素都会产生MouseOver的传递事件。
    有时候希望知道鼠标是否直接在某个元素的上面,例如,按钮可能由多个图形、TextBlock等控件组合起来,鼠标的光标可能在图形元素上,也可能在TextBlock上,但都在按键的几何范围内。
    这个时候要想知道是否在某个元素上,需要调用DirectlyOver方法,该方法返回IInputElement。

获取鼠标状态

  • 鼠标键的状态用MouseButtonState来描述,这是一个枚举类型。它有两个值:一个是Pressed,另一个是Released。
    一般的鼠标有左右两个键,再加上一个小轮子;
    WPF支持五个键的鼠标,即LeftButton、RightButton、MiddleButton和XButton1、XButton2。XButton和XButton2是位于鼠标侧面的两个键。
    要获取某个键的状态,直接读取Mouse类中的相应属性就行,非常方便。

获取鼠标的位置

  • WPF中鼠标的位置是一个相对坐标,相对与某个控件的左上角(0,0)。
    若鼠标位于该元素的左边,那么X值为负值;若鼠标位于该元素的上面边,那么Y值为负值;GetPosition(IInputElement)返回的是Point类型,为鼠标的光标所在点的位置。

设置鼠标的光标,

  • 鼠标的光标有时可以用来直观地表示应用程序所处的状态。
    Mouse类中的SetCursor方法可以改变鼠标的光标。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容