首页  ·  知识 ·  移动开发
WP7中SilverLight中触摸事件和事件路由
音乐啤酒    Wphone  编辑:dezai   图片来源:网络
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;
        }
 
本文作者:音乐啤酒 来源:网络
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的