《Programming WPF》学习(四)输入

      4.1路由事件

      在.Net标准的处理机制中,一个类有若干个事件,而事件可以有任意多个订阅者,而没有注册事件处理函数的事件将被忽略,这样的处理机制在WPF中会产生很大的局限性。试想一下,我们定一个按钮,来响应单击事件的某些处理,而在WPF程序中,按钮不单纯只是个按钮,最起码它包含了2个元素(文本和矩形),或许又包含了一个Image等元素。如果采用标准的.Net事件处理机制,那么就必须为每个元素定制一个鼠标单击事件的处理函数来处理Button的单击事件,而且处理内容都一样,我想谁也不会那么傻的去用这种方式来处理。WPF中的路由事件不仅仅会调用该元素引发的事件处理,而且还会遍历用户界面元素树,调用所有与该路由事件相关的事件处理,其中包含从起始元素直到用户界面元素树根部之间的任何节点。

       一个路由事件可以向上传递、向下传递、也可以直接发送。直接发送就跟.Net的普通事件一样处理,不会发生真正的路由;向上传递首先查找出当前触发元素的处理函数,再一直向上查询器元素的相同事件处理函数,直至根部,向上传递一般用来处理事件处理函数执行前的准备工作;向下传递正好跟向上传递相反。

                x:Name="myEllipse"          />
      
<Ellipse />
      
<Ellipse .../>
      
<Path Data="M 5,10 A 3,3 0 0 0 13,10" Stroke="Black"/>
    
</grid>
</Button>

      在每个元素中定义了PreviewMouseDown和MouseDown时间的对应处理函数,举个例子,单点击其中的Ellispe图形对象时,路由事件会从这个Ellipse元素的PreviewMouseDown开始依次执行上一级父元素的相同事件(在这里可以为处理做准备工作等),在向上路由至Buttion后,则开始向下路由,即从Buttion开始知道被单击的Ellipse依次执行MouseDown的事件处理函数。

      在有些情况下,可以通过设置RoutedEventArgs的Handled属性来阻塞路由事件的进一步处理。例如,上面代码的Button元素的路由事件,MouseUp时间之后产生的MouseDown可以转换成Click事件,因此只有Click事件能传递到控件之外。在ButtonDownCanvas的方法中,设置e.handled=true;即可阻止事件后续的向上和向下传递。

      你也可以移除xaml的MouseDown和PreviewMouseDown属性,而在隐藏代码页面以代码方式添加事件,如:myEllipse.MouseDown+=MouseDownEllipse;

      附加事件

      类似于附加属性语法,你也可以为某一元素附加一个事件处理。

      <Grid Mouse.PreviewMouseDown="PreviewMouseDownGrid"

              Mouse.MouseDowm="MouseDownGrid">

      4.2设备输入

       4.2.1鼠标输入

      对于各种设备所存在的事件就不一一列出。在WPF中所谓的“透明”有两层意思,即对用户来讲的可视化的透明,以及对鼠标设备来讲的透明。例如,我们可能要创建一个某一部分透明的元素,但却希望鼠标单击仍可以识别。在这种情况下,可以使用一个透明的画刷,将该画刷的Opacity值设成0,那么这个元素就对客户不可见对鼠标可见了。反之,如果想让鼠标忽略某一可视化元素,设置所有元素都存在的IsHitTestVisable属性即可。

      鼠标Mouse类听够一些静态属性和方法,用于获得当前鼠标的信息或者状态。如GetPosition获取鼠标坐标,Captured属性返回当前捕获到鼠标的元素,静态Mouse.DirectlyOver获取程序中鼠标正在那个元素之上,Mouse.OverrideCursor用于设置是鼠标样式等。

      4.2.2键盘输入

      KeyBoard类提供Modifiers静态属性,用于获取按下的修饰键(ALT、Shift、Ctrl);IskeyDowmn和IsKeyUp方法用于检查某一按键的状态,如:bool isHomeKeyPress=KeyBoard.IsKeyDown(Key.Home);

      4.2.3lnl(手写笔)输入

      Stylus中提供类似于Mouse类的一些方法和属性用于获取lnk的状态等信息。在WPF中提供高级别的ink处理元素InkCanvas用来处理所有link的底层事件。<InkCanvas \>

      4.3命令

      WPF中的命令系统式为了让UI元素可以为一个命令提供单独的处理函数,以减少复杂度和提高代码清晰度。

 

系统命令使用

 示例中的文本框的文本剪切、复制、粘贴操作无需其他函数处理,其中的快捷方式仍然有效。

       对于命令系统,由五个核心:(1)命令对象Command Object,用来表示特定的命令,如复制、粘贴;(2)输入绑定Input Binding,用来建立特定的输入和命令对象之间的关系,特定输入比如Ctrl+C;(3)命令源Command Source,用来调用命令的对象,比如一个按钮或者是输入绑定。(4)命令目标Command Target,指示执行命令的UI元素。(5)命令绑定Command Binding,值一种特定UI元素如何处理特定命令的申明。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2009-04-19 00:40  部落酋长  阅读(777)  评论(0编辑  收藏  举报