タブレット PC のインクの利点の 1 つは、通常のペンと紙で書くのと同じように感じることです。 これを実現するために、タブレット ペンはマウスよりもはるかに高い速度で入力データを収集し、ユーザーが書き込むにつれてインクをレンダリングします。 アプリケーションのユーザー インターフェイス (UI) スレッドは、ペン データを収集してインクをレンダリングするのに十分ではありません。ブロックされる可能性があるためです。 これを解決するために、WPF アプリケーションは、ユーザーがインクを書き込むときに 2 つの追加スレッドを使用します。
次の一覧では、デジタル インクの収集とレンダリングに参加するスレッドについて説明します。
ペン スレッド - スタイラスから入力を受け取るスレッド。 (実際には、これはスレッド プールですが、このトピックではペン スレッドと呼びます)。
アプリケーション ユーザー インターフェイス スレッド - アプリケーションのユーザー インターフェイスを制御するスレッド。
動的レンダリング スレッド - ユーザーがストロークを描画するときにインクをレンダリングするスレッド。 動的レンダリング スレッドは、「Window Presentation Foundation Threading Model」で説明されているように、アプリケーションの他の UI 要素をレンダリングするスレッドとは異なります。
手描き入力モデルは、アプリケーションで InkCanvas を使用する場合も、インク入力コントロールを作成する場合と同様のカスタム コントロールを使用する場合も同じです。 このトピックでは、 InkCanvasの観点からスレッド処理について説明しますが、カスタム コントロールを作成する場合も同じ概念が適用されます。
スレッドの概要
次の図は、ユーザーがストロークを描画するときのスレッド モデルを示しています。
ユーザーがストロークを描画している間に発生するアクション
ユーザーがストロークを描画すると、スタイラス ポイントがペン スレッドに入ります。 DynamicRendererを含むスタイラス プラグインは、ペン スレッド上のスタイラス ポイントを受け入れ、InkCanvasが受け取る前にそれらを変更する機会があります。
DynamicRendererは、ダイナミック レンダリング スレッドにスタイラス ポイントをレンダリングします。 これは、前の手順と同時に発生します。
InkCanvasは、UI スレッド上のスタイラス ポイントを受け取ります。
ユーザーがストロークを終了した後に発生するアクション
ユーザーがストロークの描画を完了すると、 InkCanvas によって Stroke オブジェクトが作成され、 InkPresenterに追加され、静的にレンダリングされます。
UI スレッドは、ストロークが静的にレンダリングされることを DynamicRenderer に通知するため、 DynamicRenderer はストロークの視覚的表現を削除します。
インク コレクションとスタイラス プラグイン
各 UIElement には StylusPlugInCollectionがあります。 StylusPlugIn内のStylusPlugInCollection オブジェクトは、ペン スレッド上のスタイラス ポイントを受け取り、変更できます。 StylusPlugIn オブジェクトは、StylusPlugInCollectionの順序に従ってスタイラス ポイントを受け取ります。
次の図は、StylusPlugInsのUIElement コレクションに、その順序でstylusPlugin1
、DynamicRenderer、およびstylusPlugin2
が含まれているという仮定の状況を示しています。
前の図では、次の動作が行われます。
StylusPlugin1
は x と y の値を変更します。DynamicRenderer は変更されたスタイラス ポイントを受け取り、動的レンダリング スレッドでレンダリングします。
StylusPlugin2
は変更されたスタイラス ポイントを受け取り、さらに x と y の値を変更します。アプリケーションはスタイラス ポイントを収集し、ユーザーがストロークを完了すると、ストロークを静的にレンダリングします。
stylusPlugin1
がスタイラス ポイントを四角形に制限し、stylusPlugin2
スタイラス ポイントを右に移動します。 前のシナリオでは、 DynamicRenderer は制限付きスタイラス ポイントを受け取りますが、変換されたスタイラス ポイントは受け取りません。 ユーザーがストロークを描画すると、ストロークは四角形の境界内にレンダリングされますが、ユーザーがペンを持ち上げるまでストロークは変換されません。
UI スレッドでスタイラス プラグインを使用して操作を実行する
ペン スレッドでは正確なヒット テストを実行できないため、一部の要素は、他の要素を対象としたスタイラス入力を受け取ることがあります。 操作を実行する前に入力が正しくルーティングされたことを確認する必要がある場合は、 OnStylusDownProcessed、 OnStylusMoveProcessed、または OnStylusUpProcessed メソッドで操作をサブスクライブして実行します。 これらのメソッドは、正確なヒット テストが実行された後、アプリケーション スレッドによって呼び出されます。 これらのメソッドをサブスクライブするには、ペン スレッドで発生するメソッドで NotifyWhenProcessed メソッドを呼び出します。
次の図は、 StylusPlugInのスタイラス イベントに関するペン スレッドと UI スレッドの関係を示しています。
インクのレンダリング
ユーザーがストロークを描画すると、 DynamicRenderer はインクを別のスレッドにレンダリングするため、UI スレッドがビジー状態でもペンからインクが "流れる" ように見えます。 DynamicRendererは、スタイラス ポイントを収集するときに、動的レンダリング スレッドにビジュアル ツリーを構築します。 ユーザーがストロークを完了すると、 DynamicRenderer は、アプリケーションが次のレンダリング パスを実行したときに通知を受け取るように求めます。 アプリケーションが次のレンダリング パスを完了すると、 DynamicRenderer はそのビジュアル ツリーをクリーンアップします。 次の図は、このプロセスを示しています。
ユーザーがストロークを開始します。
- DynamicRendererによってビジュアル ツリーが作成されます。
ユーザーがストロークを描画しています。
- DynamicRendererによってビジュアル ツリーがビルドされます。
ユーザーがストロークを終了します。
InkPresenterは、視覚ツリーにストロークを追加します。
メディア統合レイヤー (MIL) は、ストロークを静的にレンダリングします。
DynamicRendererによってビジュアルがクリーンアップされます。
.NET Desktop feedback