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;
}