尋找能簡單處理觸摸事件的方法,silverlight低級觸控螢幕事件,由於不太方便,暫時不用,進階事件Manipulation。由於沒有發現多點觸摸處理的方法也果斷棄之。接著就發現了Toolkit的GestureListener。用了下,挺方便的。
GestureListener有下面的事件:
如,事件基本和名字所述,這裡和Manipulation的方法差不多的是GestureBegin,GestureCompleted。DragDelta.DragStarted.DragCompleted.那隨便用這個GestureListener小試一把吧。
大家如果玩過WP7的實況就知道。那個控制方向的東東,一個小圓盤。我打算用這個GestureListener來實現下那個。
要添加需要的DLL和命名空間。但是我懶,因為還得到C盤去尋找toolkit的DLL。索性拖控制項一把。這樣,神馬DLL,命名空間都給我添加好了。人懶了沒辦法。
在XAML下添加如下代碼:
<Ellipse x:Name="outside" Width="200" Height="200" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="50,50,0,0" Fill="Orange" > </Ellipse> <Ellipse x:Name="rectangle" Width="100" Height="100" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="100,100,0,0" Fill="Blue" Stroke="Red" StrokeThickness="5"> <toolkit:GestureService.GestureListener> <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragCompleted="GestureListener_DragCompleted" /> </toolkit:GestureService.GestureListener> <Ellipse.RenderTransform> <TranslateTransform x:Name="translation"/> </Ellipse.RenderTransform> </Ellipse>
在設計器上顯示如下:
現在思路是:主要處理觸摸操作在裡面的圓。使之可以在外圓裡面動,那麼要做的只是在Delta下控制內圓的位置和DragCompleted下把內圓放回原處。感覺不錯的是DragDeltaGestureEventArgs提供了平行和豎直方向的座標改變值。這樣做起來就相當方便了。
那麼代碼如下:
private void GestureListener_DragDelta(object sender, DragDeltaGestureEventArgs e) { double x = this.translation.X + e.HorizontalChange; double y = this.translation.Y + e.VerticalChange; if (x <= -50) this.translation.X = -50; else if (x >= 50) this.translation.X = 50; else this.translation.X = x; if (y <= -50) this.translation.Y = -50; else if (y >= 50) this.translation.Y = 50; else this.translation.Y = y; } private void GestureListener_DragCompleted(object sender, DragCompletedGestureEventArgs e) { this.translation.X = 0; this.translation.Y = 0; }
這樣,就可以實現內圓在外圓上運動了。如果想要知道究竟現在手指控制的方向是上下左右什麼的。自己判斷translation的座標就知道了。這個TranslateTransform提供的是左上方的座標並且相對自己為(0,0)。很好處理吧。
不過,可惜的是,這個GestureListener也是用的是主要觸摸點,如果是非主要觸摸點它又不工作了。。。。可惜了。不過做些手勢操作識別還是很不錯的選擇。