筆墨執行緒模型
在平板電腦上書寫的好處之一,就是感覺很像使用一般紙筆書寫。 為達到這一效果,平板電腦手寫筆以遠高於滑鼠的速度收集輸入資料,並在使用者繪製書寫時同時轉譯筆跡。 應用程式的使用者介面 (UI) 執行緒不足以收集畫筆數據和轉譯筆跡,因為它可能會被其他操作阻擋。 為了解決這個問題,當使用者寫入筆跡時,WPF 應用程式會使用兩個額外的執行緒。
下列是負責收集和呈現數位筆跡的執行緒:
手寫筆執行緒 - 負責從手寫筆接收輸入資料的執行緒。 (實際上,這是一個執行緒集區,但本主題稱其為手寫筆執行緒。)
應用程式 UI 執行緒——負責控制應用程式使用者介面的執行緒。
動態轉譯執行緒——負責在使用者繪製筆劃時即時轉譯為電子筆跡的執行緒。 動態轉譯執行緒與轉譯應用程式其他 UI 元素的執行緒不同,如 Window Presentation Foundation 執行緒模式中所述。
無論應用程式是使用 InkCanvas 還是類似建立筆跡輸入控制項中的自訂控制項,筆跡處理模型都是相同的。 雖然本主題討論了 InkCanvas 執行緒處理的概念,但相同的概念也適用於自訂控制項時。
執行緒概觀
下圖說明使用者繪製筆劃時的執行緒模式:
繪製筆劃時的執行緒模式。執行緒模式_繪製筆劃
使用者繪製筆劃時的執行動作
當使用者繪製筆劃時,手寫筆點會透過手寫筆執行緒進入系統。 手寫筆外掛程式,包括 DynamicRenderer,會接收手寫筆執行緒上的手寫筆點,並有機會在 InkCanvas 接受筆點之前加以修改。
DynamicRenderer 會在動態轉譯執行緒上轉譯手寫筆點。 這與上一個步驟同時進行。
InkCanvas 在 UI 執行緒中接收手寫筆點。
使用者完成筆劃後的執行動作
當使用者完成筆劃時,InkCanvas 會創建一個 Stroke物件,並將其新增到 InkPresenter,以靜態方式轉譯。
UI 執行緒通知 DynamicRenderer 筆劃已靜態轉譯,而 DynamicRenderer 則會移除該筆劃的視覺呈現。
筆跡集合和手寫筆外掛程式
每個 UIElement 都有 StylusPlugInCollection。 StylusPlugInCollection 中的 StylusPlugIn 物件接收並可修改手寫筆執行緒上的手寫筆點。 StylusPlugIn 物件會根據其在 StylusPlugInCollection中的順序接收手寫筆點。
下圖說明 UIElement 中的 StylusPlugIns 集合依次包含 stylusPlugin1
、DynamicRenderer 和 stylusPlugin2
的假設情況。
手寫筆外掛程序的順序會影響輸出結果。筆跡執行緒_外掛程式順序
在上圖中,發生了以下行為:
StylusPlugin1
修改了 x 和 y 的值。DynamicRenderer 接收修改過的手寫筆點,並在動態轉譯執行緒上轉譯。
StylusPlugin2
接收了修改過的手寫筆點,並進一步修改 x 和 y 的值。應用程式會收集手寫筆點,當使用者完成筆劃時,以靜態方式轉譯筆劃。
假設 stylusPlugin1
將手寫筆點限制在矩形內,而 stylusPlugin2
將手寫筆點向右移動。 在上述案例中,DynamicRenderer 接收到的是受限於矩形的手寫筆點,而不是被平移的手寫筆點。 當使用者繪製筆劃時,筆劃會在矩形範圍內轉譯呈現,但直到使用者抬起筆前,筆劃並不會顯示平移效果。
在 UI 執行緒上使用手寫筆外掛程式進行操作
由於無法在手寫筆執行緒上執行精確的點擊測試,因此某些元素偶爾可能會收到適用於其他元素的手寫筆輸入數據。 如果在執行操作前需要確認輸入的路由是否正確,請訂閱並在 OnStylusDownProcessed、OnStylusMoveProcessed 或 OnStylusUpProcessed 方法中執行操作。 應用程式執行緒在完成精確的點擊測試之後會叫用這些方法。 若要訂閱這些方法,請在手寫筆執行緒出現的方法中呼叫 NotifyWhenProcessed 方法。
下圖說明手寫筆執行緒與 UI 執行緒在 StylusPlugIn 手寫筆事件中的關係。
筆跡執行緒模式 (UI 和 手寫筆)筆跡執行緒模式_外掛程式回呼
轉譯筆跡
當使用者繪製筆劃時, DynamicRenderer 會在個別的執行緒上轉譯筆跡,因此即使在 UI 執行緒忙碌時,筆跡也能隨著手寫筆「流動」呈現。 DynamicRenderer 會在收集手寫筆點時,在動態轉譯執行緒上建構視覺化樹狀結構。 當使用者完成筆畫時,DynamicRenderer 會要求在應用程式進行下一次轉譯時收到通知。 當應用程式完成下一次轉譯後,DynamicRenderer 會清除其視覺化樹狀結構。 下圖說明此流程。
手寫筆執行緒圖示手寫筆執行緒_視覺化樹狀結構
使用者開始繪製筆畫。
- DynamicRenderer 創建視覺化樹狀結構。
使用者正在繪製筆劃。
- DynamicRenderer 建構視覺化樹狀結構。
使用者完成筆畫。
InkPresenter 將筆劃新增至其視覺化樹狀結構。
媒體整合層 (MIL) 會以靜態方式轉譯筆劃。
DynamicRenderer 清理視覺效果。