2019 11 29 WPF 模擬觸控裝置

2022-01-12 07:20:04 字數 2994 閱讀 1396

title

author

date

createtime

categories

wpf 模擬觸控裝置

lindexi

2019-11-29 08:47:53 +0800

2019-5-11 17:2:6 +0800

wpf在 wpf 中觸控只是框架的一層,可以通過**模擬觸控

建立乙個類繼承 touchdevice 然後重寫 gettouchpoint 和 getintermediatetouchpoints 方法,可以在這個類裡面通過呼叫 reportdown 等方法模擬觸控的按下和移動

最簡單的實現請看下面**

public

class

burnerkadelwallnadarli : touchdevice

///>

/// 觸控點

///summary

>

public

point

position

///>

/// 觸控大小

///summary

>

public

size

size

public

void

down()

else

}public

void

move()

public

void

up()

private

window

window

private

touchaction

touchaction

////>

public

override

touchpoint

gettouchpoint(iinputelement

relativeto)

////>

public

override

touchpointcollection

getintermediatetouchpoints(iinputelement

relativeto);}

}

在 touchdevice 裡面,呼叫觸控按下和移動等的方法是沒有傳入引數的,在框架是通過 gettouchpoint 拿到當前使用者觸控的點

在按下的時候需要啟用,啟用的時候需要傳入乙個 presentationsource 在框架通過這個值進行命中測試找到觸控按下的點是按到哪個元素

使用的時候只需要建立 burnerkadelwallnadarli 然後呼叫對應的按下移動等方法就可以了,因為在構造的時候傳入了視窗,所以在按下等事件可以通過傳入的視窗進行命中測試找到按下的元素,從元素觸發路由事件

大概的呼叫順序是這樣的,在觸控的第乙個事件是按下,在按下的時候使用下面**

setactivesource(presentationsource.fromvisual(window));

activate();

reportdown();

在 setactivesource 會將傳入的 presentationsource 設定在本地的字段_activesource這樣可以在拿到點的時候呼叫

在呼叫 activate 方法會呼叫一次 updatedirectlyover 這個方法呼叫 gettouchpoint 傳入乙個空引數,用來判斷當前是否命中到元素,一般都是沒有命中的,需要到 reportdown 的時候才可能命中元素。在 activate 會將當前的 touchdevice 加入到touchdevice._activedevices這個靜態字段裡面,如果剛好這時的靜態字段只有乙個元素,那麼就設定當前的觸控裝置是主觸控裝置

設定觸控裝置是主觸控裝置是因為在觸控的時候如果使用者是多個手指觸控,乙個手指對應乙個觸控裝置,所以第乙個手指對應主觸控裝置

呼叫 reportdown 會先設定本地字段_isdown為 true 然後呼叫 updatedirectlyover 方法更新當前按下點到的元素,然後呼叫 raisetouchdown 方法在當前點到的元素觸控觸控按下的路由事件,可以看到此時的路由事件是不需要再獲取當前的觸控點,因為只是在點到的元素觸控事件,如果這個元素需要知道當前的觸控點,只需要在方法使用引數的e.gettouchpoint方法就可以重新拿到觸控點。因為獲取觸控點方法是可以重寫的,所以第一次獲取的用於命中測試的觸控點可以和元素收到觸控事件獲取的觸控點返回不同的點

只需要拿到了對應的元素就可以在元素觸發事件,從觸控到事件請看wpf 觸控到事件

呼叫 reportmove 移動的方法也是差不多,首先通過 updatedirectlyover 找到命中測試的元素,然後觸發路由事件。如果元素不關注觸控點選的點就不需要再次呼叫獲取觸控點方法

那麼 updatedirectlyover 是如何進行命中測試的?首先通過獲取觸控點方法拿到傳入空引數時的觸控點,這時相對的應該是視窗的座標。通過 touchdevice.localhittest 方法拿到命中測試的元素,在底層呼叫的是 mousedevice.localhittest 方法

所以可以通過上面定義的類模擬觸控,只需要建立出來,然後呼叫對應的方法就可以,如下面的**就模擬了按下和移動

var

burnerkadelwallnadarli

=new

burnerkadelwallnadarli(1, this);

await

task.delay(1000);

burnerkadelwallnadarli.down();

await

task.delay(1000);

// 設定當前觸控點

burnerkadelwallnadarli.move();

通過這個方法模擬觸控可以走原有的 wpf 觸控命中測試,也能走路由事件

關於 wpf 的觸控到事件請看 wpf 觸控到事件

本文用到的**放在 github

2019 11 29 WPF 從觸控訊息轉觸控事件

title author date createtime categories wpf 從觸控訊息轉觸控事件 lindexi 2019 11 29 08 47 55 0800 2019 05 12 15 12 31 0800 wpf在 wpf 程式可能因為一些坑讓程式觸控失效,如果此時還可以收到系統...

2019 11 29 WPF 高效能筆

title author date createtime categories wpf 高效能筆 lindexi 2019 11 29 10 20 51 0800 2018 2 13 17 23 3 0800 筆跡 wpf 高效能的筆跡在 wpf 包含兩個部分,乙個是就是輸入,第二個就是渲染。如果需...

WPF 觸控失效 試試重啟觸控

在使用一些詭異的系統以及詭異的觸控框的時候,也許會出現 wpf 程式觸控失效,失效的本質原因是 win32 層應用觸控失效。也許出現的問題是某個視窗設定 topmost 然後插拔一些觸控裝置等,這些行為,如果觸控裝置太過詭異,也許就會讓 win32 視窗觸控失效。剛好 wpf 也是乙個 win32 ...