[遇到的問題]
目前想做的功能是在主 Panel (後稱 MainPanel)中放多個 Panel(包含圖片、Label、Button等元件,後稱 ItemPanel)按鈕。在觸控螢幕上下滑動來捲動 MainPanel 。
一開始測試其實不用特別加什麼事件在 MainPanel 滑動就可以移動卷軸了,類似在滑手機時那種效果,但如果按到 ItemPanel 開始滑就沒有反應。說起來也是很合理,所以就在 ItemPanel 及其包含的元件加上 MouseEvent 來實作捲動效果了。
但這時候遇到一個很神奇的問題,就是如果我先去滑動 MainPanel 的話,要放置一段時間後才能去點 ItemPanel 做滑動。如果一直嘗試去滑動,等候時間就會延長 ..
先不考慮換改用 WFP 及 UWP 來製作的情況下 … 有人遇到過這個問題或知道怎麼處理嗎?
[嘗試過的解決方法]
直接從 win10 關掉滑動手勢:
但找不到地方可以關, Google 到的資訊是去 Pen And Touch 那邊設定,但看到的設定視窗中沒有那些頁面 orz
在 MainPanel 上面也加滑鼠事件:
用滑鼠的時候是正常,但用觸控的時候還是 Windows 的手勢事件優先。
在 MainPanel 複寫 WndProc 攔截 gesture 事件:
有成功捕捉到事件,但仍然沒能阻止手勢事件作用,不知道是不是我寫錯…
WndProc 攔截的程式
const int WM_GESTURENOTIFY = 0x11a;
const int WM_TABLET_QUERYSYSTEMGESTURESTATUS = 0x2cc;
const int TABLET_DISABLE_FLICKS = 0x00010000;
[DllImport("user32")]
static extern bool SetProp(IntPtr hWnd, string lpString, IntPtr hData);
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_TABLET_QUERYSYSTEMGESTURESTATUS) {
return;
}
switch (m.Msg)
{
case WM_GESTURENOTIFY:
SetProp(this.Handle, "MicrosoftTabletPenServiceProperty",
new IntPtr(0x10000));
return;
case WM_TABLET_QUERYSYSTEMGESTURESTATUS:
// 方法1. 直接 return
return;
// 方法2. set Message.Result
m.Result = (IntPtr)TABLET_DISABLE_FLICKS;
default:
base.WndProc(ref m);
break;
}
}
無論如何感謝看完我的問題 <(_ _)>