WP7中SilverLight中触摸事件和事件路由

window phone中SilverLight开发模式下的触发事件

SL支持两种不同的编程接口来支持触摸事件,可以分为底层接口和高层接口。

底层接口是基于静态的Touch.FrameReported事件,

高层接口是由UIElment中定义的3个事件组成:ManipulationStarted,ManipulationDelta,ManipulationCompleted

1.底层接口

在对应的Page中注册该底层接口

 Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);

 void Touch_FrameReported(object sender, TouchFrameEventArgs e)
        {
            TouchPoint point = e.GetPrimaryTouchPoint(null);
            throw new NotImplementedException();
        }

底层接口的核心是TouchPoint类,他的每个实例表示触摸屏幕的一个特定手指,主要属性如下:

Action:包含Down,UP,Move3个枚举

Position:相对于特定元素的坐标位置

Size:触摸面积大小

TouchDevice:这个类有两个主要属性,ID,用于区分不同的手指,DirectlyOver,表示触摸手指下的直接的顶层UI控件元素

在底层注册事件中TouchFrameEventArgs 这个参数,传递很多的触摸信息

TouchFrameEventArgs.GetPrimaryTouchPoint(UIElment)这个表示主触摸点(当没有其他手指触摸屏幕的时候,第一个手指触摸屏幕的活动)

传入的参数是获得相对的Touchpoint,如果传入null,就是表示相对于屏幕的左上坐标位置而言

TouchPointCollection pointCollent = e.GetTouchPoints(null);这个表示所有触摸的集合

有时候部分触摸事件可以提升为鼠标事件,但是有时候要避免这个情况

e.SuspendMousePromotionUntilTouchUp();这个方法可以避免主动把触摸事件提升为鼠标时间

2.高层接口


ManipulationStarted:当手指按下触摸屏时发生

ManipulationDelta:当手指在屏幕上移动的时候发生

ManipulationCompleted:当手指离开(释放)屏幕的时候发生

高层接口的事先可以直接定义到某个UI控件上,每个UI控件都可以直接实现这3个事件

假设页面有个Button控件,可以这样定义

            <Button x:Name="btn2"  ManipulationStarted="btn2_ManipulationStarted" Height="80">GotoPage1</Button>

cs代码如下

 private void btn2_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
        {
            Button btn2 = sender as Button;
            //Button btn2 = e.OriginalSource as Button;
            //Button btn2 =e.ManipulationContainer as Button;

        }

有时候需要把触摸事件定义到整个页面上,而不是单独的控件上,也是可以。

因为PhoneApplicationPage继承了Control类,Control类中定义了触摸事件的虚函数,只要重写就可以

 protected override void OnManipulationStarted(ManipulationStartedEventArgs e)
        {
            base.OnManipulationStarted(e);
            
            if (e.OriginalSource == btn1)
            {
                btn1.Content = "On Manipulation Started";
            }
            else
            {
                btn1.Content = "Not Manipulation";
            }
            e.Complete();
        }

关于Xaml中的事件路由

Xaml中的事件可以由某一个控件触发,如果这个控件关心这个事件,这个事件可以路由到这个控件的父控件中,而且一直可以向上路由到最高级的控件上PhoneApplicationFrame上。

如果是多层控件,事件是由内到外 一层一层的触发事件

比如TextBlock可以触发一个ManipulationStarted事件,这个事件也可以由TextBlock控件所在的页面级别的事件OnManipulationStarted捕获

但是如果在TextBlock的事件中设置ManipulationStartedEventArgs.Handle =true,表示说这个事件已经处理了,那么父层控件的事件就会忽略这个事件

 private void TextBlock_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
        {

            e.Handled = true;
        }

原文地址:https://www.cnblogs.com/zjypp/p/2335153.html