共用方式為


筆墨執行緒模型

在平板電腦上書寫的好處之一,就是感覺很像使用一般紙筆書寫。 為達到這一效果,平板電腦手寫筆以遠高於滑鼠的速度收集輸入資料,並在使用者繪製書寫時同時轉譯筆跡。 應用程式的使用者介面 (UI) 執行緒不足以收集畫筆數據和轉譯筆跡,因為它可能會被其他操作阻擋。 為了解決這個問題,當使用者寫入筆跡時,WPF 應用程式會使用兩個額外的執行緒。

下列是負責收集和呈現數位筆跡的執行緒:

  • 手寫筆執行緒 - 負責從手寫筆接收輸入資料的執行緒。 (實際上,這是一個執行緒集區,但本主題稱其為手寫筆執行緒。)

  • 應用程式 UI 執行緒——負責控制應用程式使用者介面的執行緒。

  • 動態轉譯執行緒——負責在使用者繪製筆劃時即時轉譯為電子筆跡的執行緒。 動態轉譯執行緒與轉譯應用程式其他 UI 元素的執行緒不同,如 Window Presentation Foundation 執行緒模式中所述。

無論應用程式是使用 InkCanvas 還是類似建立筆跡輸入控制項中的自訂控制項,筆跡處理模型都是相同的。 雖然本主題討論了 InkCanvas 執行緒處理的概念,但相同的概念也適用於自訂控制項時。

執行緒概觀

下圖說明使用者繪製筆劃時的執行緒模式:

Threading model while drawing a stroke.繪製筆劃時的執行緒模式。執行緒模式_繪製筆劃

  1. 使用者繪製筆劃時的執行動作

    1. 當使用者繪製筆劃時,手寫筆點會透過手寫筆執行緒進入系統。 手寫筆外掛程式,包括 DynamicRenderer,會接收手寫筆執行緒上的手寫筆點,並有機會在 InkCanvas 接受筆點之前加以修改。

    2. DynamicRenderer 會在動態轉譯執行緒上轉譯手寫筆點。 這與上一個步驟同時進行。

    3. InkCanvas 在 UI 執行緒中接收手寫筆點。

  2. 使用者完成筆劃後的執行動作

    1. 當使用者完成筆劃時,InkCanvas 會創建一個 Stroke物件,並將其新增到 InkPresenter,以靜態方式轉譯。

    2. UI 執行緒通知 DynamicRenderer 筆劃已靜態轉譯,而 DynamicRenderer 則會移除該筆劃的視覺呈現。

筆跡集合和手寫筆外掛程式

每個 UIElement 都有 StylusPlugInCollectionStylusPlugInCollection 中的 StylusPlugIn 物件接收並可修改手寫筆執行緒上的手寫筆點。 StylusPlugIn 物件會根據其在 StylusPlugInCollection中的順序接收手寫筆點。

下圖說明 UIElement 中的 StylusPlugIns 集合依次包含 stylusPlugin1DynamicRendererstylusPlugin2 的假設情況。

Order of Stylus Plugins affect output.手寫筆外掛程序的順序會影響輸出結果。筆跡執行緒_外掛程式順序

在上圖中,發生了以下行為:

  1. StylusPlugin1 修改了 x 和 y 的值。

  2. DynamicRenderer 接收修改過的手寫筆點,並在動態轉譯執行緒上轉譯。

  3. StylusPlugin2 接收了修改過的手寫筆點,並進一步修改 x 和 y 的值。

  4. 應用程式會收集手寫筆點,當使用者完成筆劃時,以靜態方式轉譯筆劃。

假設 stylusPlugin1 將手寫筆點限制在矩形內,而 stylusPlugin2 將手寫筆點向右移動。 在上述案例中,DynamicRenderer 接收到的是受限於矩形的手寫筆點,而不是被平移的手寫筆點。 當使用者繪製筆劃時,筆劃會在矩形範圍內轉譯呈現,但直到使用者抬起筆前,筆劃並不會顯示平移效果。

在 UI 執行緒上使用手寫筆外掛程式進行操作

由於無法在手寫筆執行緒上執行精確的點擊測試,因此某些元素偶爾可能會收到適用於其他元素的手寫筆輸入數據。 如果在執行操作前需要確認輸入的路由是否正確,請訂閱並在 OnStylusDownProcessedOnStylusMoveProcessedOnStylusUpProcessed 方法中執行操作。 應用程式執行緒在完成精確的點擊測試之後會叫用這些方法。 若要訂閱這些方法,請在手寫筆執行緒出現的方法中呼叫 NotifyWhenProcessed 方法。

下圖說明手寫筆執行緒與 UI 執行緒在 StylusPlugIn 手寫筆事件中的關係。

Ink Threading Models (UI and Pen)筆跡執行緒模式 (UI 和 手寫筆)筆跡執行緒模式_外掛程式回呼

轉譯筆跡

當使用者繪製筆劃時, DynamicRenderer 會在個別的執行緒上轉譯筆跡,因此即使在 UI 執行緒忙碌時,筆跡也能隨著手寫筆「流動」呈現。 DynamicRenderer 會在收集手寫筆點時,在動態轉譯執行緒上建構視覺化樹狀結構。 當使用者完成筆畫時,DynamicRenderer 會要求在應用程式進行下一次轉譯時收到通知。 當應用程式完成下一次轉譯後,DynamicRenderer 會清除其視覺化樹狀結構。 下圖說明此流程。

Ink threading diagram手寫筆執行緒圖示手寫筆執行緒_視覺化樹狀結構

  1. 使用者開始繪製筆畫。

    1. DynamicRenderer 創建視覺化樹狀結構。
  2. 使用者正在繪製筆劃。

    1. DynamicRenderer 建構視覺化樹狀結構。
  3. 使用者完成筆畫。

    1. InkPresenter 將筆劃新增至其視覺化樹狀結構。

    2. 媒體整合層 (MIL) 會以靜態方式轉譯筆劃。

    3. DynamicRenderer 清理視覺效果。