次の方法で共有


インク分析を使用したデータ プロキシ

「インク分析の概要」で説明したように、インク分析テクノロジは、分析結果とリレーションシップを含むツリー ベースのドキュメント モデルを内部的に維持します。 アプリケーションに既に確立されているドキュメント ストアが異なる場合は、異なるドキュメント モデル間でデータをプロキシするように設計されたインク分析機能を利用する必要があります。

データ プロキシの種類

データ プロキシ機能を使用すると、アプリケーションで次の機能を実行できます。

  • 分析結果データを既存のドキュメント モデルに統合します。
  • 以前の結果 (または状態) を InkAnalyzer に伝えます。
  • インク以外の状態を InkAnalyzer に伝えます。
  • 分析操作を完了するために必要なデータの最小セット (前と非インクの両方の状態) のみを通信します。
  • 分析結果を使用して、内部アプリケーション ドキュメント モデルを簡単に更新できます。

インク分析データ プロキシには、2 つの基本的な方法があります。 違いは、ドキュメント モデル間の同期がいつどのように行われるかの詳細にあります。 最初の方法である同期更新では、アプリケーション ドキュメントで変更が行われると、インク分析ドキュメント モデルを変更する必要があります。 2 つ目の方法であるオンデマンド更新では、アプリケーション ドキュメント モデルの変更の影響を受けるデータのみを InkAnalyzer に渡す必要があります。 つまり、アプリケーション ドキュメントの変更と同じ領域にある Ink Analysis ドキュメント モデルの部分のデータのみを、必要に応じて InkAnalyzer に 渡す必要があります。

同期更新

同期更新アプローチでは、アプリケーション ドキュメントで発生する InkAnalyzer オブジェクトの ContextNode オブジェクトのコレクション内のノードの変更 (作成と削除) が必要です。 たとえば、テキスト ワードがアプリケーションに追加されるたびに、対応する TextWord スタイル の ContextNodeInkAnalyzer に作成されます。 ページ上のテキスト ワードの場所が変更されると、対応する ContextNode の場所が同時に更新されます。 この方法は、変更が分析されるインクに影響を与えない場合でも、すべてのドキュメント変更に InkAnalyzer の更新が含まれるため、オンデマンドの方法よりもリソースの計算効率が低くなります。

次の例は、同期更新のしくみを示すものです。 既存のドキュメント モデルを持つアプリケーションを想像してみてください。 新しいテキストの追加など、エンド ユーザーがドキュメントに変更を加えると、変更は次のように処理されます。

  1. エンド ユーザーが新しいデータを作成します。
  2. アプリケーションは、データの処理方法を決定し、データを格納してレンダリングします。
  3. 実用的な目的で、次の手順が同時に実行されます。
    1. アプリケーションは、データをドキュメント モデルに配置します。
    2. アプリケーションによって InkAnalyzer が作成され、更新されます。 これを同時に行うと、 InkAnalyzer に常に最新の情報が含まれることが保証されます。
    3. アプリケーションは InkAnalyzerBackgroundAnalyze を呼び出して分析を開始します。
  4. 変更にインクが含まれており、 InkAnalyzer によって新しい結果が決定された場合、一連のイベントが発生します。 InkAnalyzerContextNode オブジェクトのコレクションに対して行われた変更ごとに、1 つのイベントが発生します。 これらのイベントには、 ContextNodeCreatedContextNodeDeletingContextNodeMovingToPositionContextNodePropertiesUpdatedContextNodeLinkAddingContextNodeLinkDeletingContextNodeReparenting が含まれます。 アプリケーションは、これらのイベントを処理して、必要に応じて分析操作の結果をドキュメント モデルにプロキシバックします。
  5. アプリケーションはドキュメントのレイアウトを更新し、ドキュメント モデルから新しいデータをプルします。
  6. 新しいデータがエンド ユーザーにレンダリングされます。

オンデマンド更新

オンデマンドアプローチでは、分析対象の領域にある ContextNode オブジェクトに対してのみデータを渡す必要があります。 必要な ContextNode オブジェクトは、分析操作が呼び出された直後、および結果を調整する直前に、アプリケーションのドキュメント モデルから抽出されます。 同期更新よりも実装が複雑ですが、この方法ではパフォーマンスが向上します。

インク分析の概要

InkAnalyzer クラス (C++)

Microsoft.Ink.InkAnalyzer

Microsoft.Ink.ContextNode