首页  ·  知识 ·  
Label
      编辑:  图片来源:网络
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;
        }
 
本文作者:音乐啤酒 来源:网络
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的
收藏至微信