次の方法で共有


編集モデルのアーキテクチャ

デザイン時実装は、編集モデルと呼ばれるプログラミング インターフェイスを介して実行時コントロールと対話します。 デザインされるオブジェクトは、編集可能オブジェクトと呼ばれます。 このトピックでは、WPF Designer for Visual Studio の編集モデルのアーキテクチャと使用法について説明します。

コントロールは、Extensible Application Markup Language (XAML) で定義されます。 コントロールの XAML は、編集モデルを使用してプログラムで更新します。

モデル、ラッパー、およびビュー

編集モデルは、モデル、モデルを抽象化するパブリック ラッパー、およびモデルのユーザー インターフェイス (UI) を表すビューという、3 つの機能サブユニットで構成されます。 モデルとビューはそれぞれ別のものですが、ラッパーとモデルは密接に関係しています。 次の図は、3 つのサブユニットの関係を示しています。

Model、ModelItem、および View リレーションシップ

デザイン環境は、ModelItem 型を使用して、基本モデルと対話します。 すべての変更は ModelItem ラッパーに対して行われ、これが基本モデルに影響を与えます。 これによりモデルを簡略化できます。 ModelItem ラッパーは、トランザクション サポート、元に戻す処理の追跡、変更通知など、複雑なデザイナー機能を処理します。

インスタンス作成

デザイン サーフェイス上で新しいオブジェクトを作成する必要があるデザイナー機能では、ModelFactory クラスが使用されます。 デザイナー内の各オブジェクトは、ModelItem インスタンスでラップされます。 モデル アイテムは、ModelFactory によって作成されます。

次のコードは、標準的な ModelFactory 呼び出しを示しています。

ModelItem newButton = ModelFactory.CreateItem(_context, typeof(Button));

CreateItem メソッドは、ModelItem データ型を常に返します。 これは、WPF デザイナー編集モデル内のすべてのアイテムの基本型であり、CreateItem メソッドに渡された型の、ラップされたインスタンスを表します。 CreateItem メソッドには、WPF デザイナー編集コンテキスト (前述のコード サンプルの _context) のインスタンスも必要です。これを使用して、デザイナー内の別のサービスや依存関係を検索します。

既定の初期化子を持つデザイン サーフェイス上に配置されるオブジェクトに対して、ファクトリを介して明示的なアイテムを作成する必要があります。 プロパティに値を設定するだけの場合は、この手順は必要ありません。

デザイン サーフェイス上に新しいオブジェクトを作成するには、常に CreateItem メソッドを使用する必要があります。 これは、多数の生インスタンスをモデル項目に解析できないためです。 値がモデルに設定された後は、モデルを介して値を操作する必要があります。 モデルの基盤であるインスタンスは、いつでもフレームワークで再ビルドできます。これにより、キャッシュした参照は無効になります。

作成オプション

場合によっては、オブジェクトの作成動作をカスタマイズする必要があります。 たとえば、データベース接続コンポーネントが、デザイン時にはデータベースを照会しないようにできます。 コンポーネントの最初の作成時には、インスタンス作成を制御することもできます。

この場合、コンポーネントはツールボックスからドラッグするか、クリップボードから貼り付けます。 コンポーネントを有効な既定値で事前に構成した方が適切な場合もあります。 これらの既定値は、変更がなければ、XAML にシリアル化されます。

CreateOptions 列挙型を使用して、オプションのフラグのセットを CreateItem メソッドに渡すことができます。

事前に構成されたプロパティ値のセットを初期化するには、作成ツールなどのツールで InitializeDefaults フラグを使用します。 たとえば、ContentControl は、既定のコンテンツを提供できます。 実行時コントロール コードでプロパティの既定値を正しく指定する代わりにこの方法を使用することはできません。

このフラグで設定される値は、XAML でも保持されます。

デザイナーでオブジェクトを編集しているときに既定値が削除される可能性があるため、このフラグは解析コードでは使用しないでください。

CreateItem メソッドは、CreateItem への呼び出しをルーティングします。 このメソッドは、次のフローチャートに示されているさまざまな手順を実行します。

作成 API を使用した明示的なインスタンス作成

アイテムの親を新しいコンテナーに変更する

新しいアイテムの作成に加えて、あるアイテムの親を別の親に変更する作業も、一般的なデザイナーのタスクです。 これは、ModelParent という名前の静的クラスを介して行われます。このクラスは、ほとんどのペアレンティング要件に共通する機能を提供します。

  • 階層内で検索するための座標のオフセットや開始アイテムに基づいて、有効な親オブジェクトを見つけます。

  • 指定されたオブジェクトが特定の型の親になることができるかどうかを判断します。

  • あるオブジェクトの親を別の親に変更します。 また、この変更によって、オブジェクトから古い親が削除されます。 この削除によって、古い親は、アイテムにそのまま残る可能性があるすべてのデータ (添付プロパティなど) を消去できます。

ModelParent クラスは、現在の親オブジェクトおよび指定された親オブジェクトの ParentAdapter クラスを検索することにより動作します。 ParentAdapter クラスが存在しない場合、オブジェクトに親を割り当てることはできません。 ParentAdapter クラスは、一般的なケースについていくつかのオーバーライドを定義します。 たとえば、多くのオーバーライドは、GestureData オブジェクトをパラメーターとして認識します。 このデータ型は、コードがユーザー コマンドを処理しているときには、WPF デザイナー コマンド機構から使用できます。 これにより、一般的なコンテキスト情報が提供されます。

ParentAdapter を使用することで、コンテナーは親を簡単に削除できます。 たとえば、Canvas コントロールを親に持つオブジェクトが、親を Grid コントロールに変更すると、オブジェクト上の Canvas コントロールの添付プロパティが自動的に削除されます。

参照

参照

EditingContext

Microsoft.Windows.Design.Services

GestureData

その他の技術情報

WPF デザイナーの機能拡張