WPF觸屏Touch事件在巢狀控制項中的響應問題

2021-09-19 22:00:02 字數 1457 閱讀 1117

原文:

wpf觸屏touch事件在巢狀控制項中的響應問題

前幾天遇到個touch事件的坑,記錄下來以增強理解。

具體是 想把乙個listview巢狀到另乙個listview,這時候如果list view(子listview)的內容過多超過容器高度,它是不會出現滾動條壓縮內容區域的,反而會將滾動區域轉移到外面的list view(父listview),這個無可爭議,但這個問題開始沒留意,為待會的坑埋下伏筆。

因為 然後就是設定滑鼠滾輪。

首先我使用了mousewheel事件,奇怪的是它明明是個路由事件,然而listview似乎做了處理,沒有冒泡到父級。

於是我改寫previewmousewheel事件,吧從父級傳過來的時間再冒泡回去。

在子類的listview中,我在滾動事件裡寫了個向上傳遞的觸發事件:

private

void bodylist_previewmousewheel(object

sender, mousewheeleventargs e)

這樣我就能實現當滑鼠焦點在子listview時,能觸發父級的滾動事件

這時候為了觸控螢幕操作,我如是寫了touchdown .touchmove touchup 三個事件,可是,當手勢在子listview做滑動操作的時候,父級不滑動。

即使我完全偽造乙個source為上級的touch事件,父級仍然巋然不動,如圖:

private

void uielement_ontouchmove(object

sender, toucheventargs e)

於是我開始找原因,touch事件同樣是路由事件,於mousewheel不同的是,我可以在父listview觸發它。

那麼是什麼原因呢,通過視覺化樹工具,可以發現,在巢狀的listview中實際上巢狀了兩個scrollview, 當touch事件在 子listview中觸發時,實際上事件被子級中的scrollview吸收了。但是為何偽造後仍然無法反應?

那是由於touch事件是乙個特殊的事件,至少有別於滾輪事件,控制項需要對手勢在觸控螢幕上的座標做出響應,兩個相互巢狀的滑動控制項,無法對同一手勢座標做出反應,否則他們之間的相對位置就會發生改變,也就是說兩個scrollview不能同時依賴乙個手勢源,只有最上層的scrollview才能響應目標源。

不知道微軟為何這麼設定,至少我的理解是這樣的

由於開始的設定,子listview中的scrollview永遠不會有效果。因此容易被忽略

所以我們只要重寫底層listview的template就好了,把原來包裹itemspresenter的scrollview控制項給刪掉

touch事件就能被父一級的listview觸發了!

希望這個繞坑的經歷能幫助到大家,謝謝!

WPF觸屏Touch事件在巢狀控制項中的響應問題

原文 wpf觸屏touch事件在巢狀控制項中的響應問題 前幾天遇到個touch事件的坑,記錄下來以增強理解。具體是 想把乙個listview巢狀到另乙個listview,這時候如果list view 子listview 的內容過多超過容器高度,它是不會出現滾動條壓縮內容區域的,反而會將滾動區域轉移到...

移動端觸屏滑動touch事件相關

移動端觸屏滑動的效果其實就是輪播,在pc的頁面上很好實現,繫結click和mouseover等事件來完成。但是在移動裝置上,要實現這種輪播的效果,就需要用到核心的touch事件。處理touch事件能跟蹤到螢幕滑動的每根手指。以下是四種touch事件 touchstart 手指放到螢幕上時觸發 tou...

手機端html5觸屏事件 touch事件

touchstart 觸控開始的時候觸發 touchmove 手指在螢幕上滑動的時候觸發 touchend 觸控結束的時候觸發 而每個觸控事件都包括了三個觸控列表,每個列表裡包含了對應的一系列觸控點 用來實現多點觸控 touches 當前位於螢幕上的所有手指的列表。targettouches 位於當...