2009年9月28日 星期一

在WPF中關閉觸控指標(Disable Touch Pointer)

在Win Vista之後,微軟針對觸控做了不少改變
其中很明顯的改變就是增加了觸控指標(Touch Pointer)
還有輕拂手勢(Flicks Gesture)
但這兩個新增的東西對於程式開發人員常常造成很討厭的干擾
(也許這就是為什麼在Win7上面這個功能不再是預設屬性了)

在早期的Win32視窗以及.net Form的應用程式之中
有提供底層的API來將這些有關觸控的新增訊息給取消的機制
請參考Disable flicks and mouse pointer

但要把這個方法套用到WPF上面的時候會遇到幾個問題
首先是要使用到unmanagement的Win32 API
這會對WPF的封閉性及安全性造成一些顧慮
另外則是在WPF中已經取消handle這個概念了
所以最多只能針對一整個視窗取消這個功能
要對單一物件基本上是不可能的

幸好WPF中另外提供了簡易的方式
對於希望關掉該功能的控制項,更改對應的屬性

private void DisableTouchStylus(UIElement u)
{
/// disable flicks gesture
Stylus.SetIsFlicksEnabled(u, false);

/// disable press and hold gesture
Stylus.SetIsPressAndHoldEnabled(u, false);

/// disable tap gesture
Stylus.SetIsTapFeedbackEnabled(u, false);

/// disable touch pointer
Stylus.SetIsTouchFeedbackEnabled(u, false);
}

另外,也可以在該控制項的XAML宣告裡面直接更改
例如希望關掉Canvas的觸控效果的話

<Canvas Stylus.IsFlicksEnabled="False"
Stylus.IsPressAndHoldEnabled="False"
Stylus.IsTapFeedbackEnabled="False"
Stylus.IsTouchFeedbackEnabled="False" />

注意,在WPF裡面設定的效果都會套用到所有的子元件
所以如果需要整個視窗都關閉的話,只需要在最外層的視窗設定就好了

--
參考資料
Disable flicks and mouse pointer
Stylus.IsFlicksEnabled 附加屬性

沒有留言:

張貼留言