更新 : 2007 年 11 月
デザイン時実装は、編集モデルと呼ばれるプログラミング インターフェイスを介して実行時コントロールと対話します。デザインされるオブジェクトは、編集可能オブジェクトと呼ばれます。このトピックでは、Windows Presentation Foundation (WPF) Designer for Visual Studio の編集モデルのアーキテクチャと使用法について説明します。
コントロールは、Extensible Application Markup Language (XAML) で定義されます。コントロールの XAML は、編集モデルを使用してプログラムで更新します。
モデル、ラッパー、およびビュー
編集モデルは、モデル、モデルを抽象化するパブリック ラッパー、およびモデルのユーザー インターフェイス (UI) を表すビューという、3 つの機能サブユニットで構成されます。モデルとビューはそれぞれ別のものですが、ラッパーとモデルは密接に関係しています。次の図は、3 つのサブユニットの関係を示しています。
デザイン環境は、ModelItem 型を使用して、基本モデルと対話します。すべての変更は ModelItem ラッパーに対して行われ、これが基本モデルに影響を与えます。これによりモデルを簡略化できます。ModelItem ラッパーは、トランザクション サポート、元に戻す処理の追跡、変更通知など、複雑なデザイナ機能を処理します。
インスタンス作成
デザイン サーフェイス上で新しいオブジェクトを作成する必要があるデザイナ機能では、ModelFactory クラスが使用されます。デザイナ内の各オブジェクトは、ModelItem インスタンスでラップされます。モデル アイテムは、ModelFactory によって作成されます。
次のコードは、標準的な ModelFactory 呼び出しを示しています。
ModelItem newButton = ModelFactory.CreateItem(_context, typeof(Button));
CreateItem メソッドは、ModelItem データ型を常に返します。これは、WPF デザイナ編集モデル内のすべてのアイテムの基本型であり、CreateItem メソッドに渡された型の、ラップされたインスタンスを表します。CreateItem メソッドには、WPF デザイナ編集コンテキスト (前述のコード サンプルの _context) のインスタンスも必要です。これを使用して、デザイナ内の別のサービスや依存関係を検索します。
既定の初期化子を持つ可能性のあるデザイン サーフェイス上に配置されるオブジェクトに対してのみ、ファクトリを介して明示的なアイテムを作成する必要があります。プロパティに値を設定するだけの場合は、この手順は必要ありません。
作成オプション
場合によっては、オブジェクトの作成動作をカスタマイズする必要があります。たとえば、データベース接続コンポーネントが、デザイン時にはデータベースを照会しないようにできます。コンポーネントの最初の作成時には、インスタンス作成を制御することもできます。
この場合、コンポーネントはツールボックスからドラッグするか、クリップボードから貼り付けます。コンポーネントを有効な既定値で事前に構成した方が適切な場合もあります。これらの既定値は、変更がなければ、XAML にシリアル化されます。
CreateOptions 列挙型を使用して、オプションのフラグのセットを CreateItem メソッドに渡すことができます。この列挙型の値とその使用法を次の表に示します。
事前に構成されたプロパティ値のセットを初期化するには、作成ツールなどのツールで InitializeDefaults フラグを使用します。たとえば、ContentControl は、既定のコンテンツを提供できます。実行時コントロール コードでプロパティの既定値を正しく指定する代わりにこの方法を使用することはできません。
このフラグで設定される値は、XAML でも保持されます。
デザイナでオブジェクトを編集しているときに既定値が削除される可能性があるため、このフラグは解析コードでは使用しないでください。
CreateItem メソッドは、CreateItem への呼び出しをルーティングします。このメソッドは、次のフローチャートに示されているさまざまな手順を実行します。
アイテムの親を新しいコンテナに変更する
新しいアイテムの作成に加えて、あるアイテムの親を別の親に変更する作業も、一般的なデザイナのタスクです。これは、ModelParent という名前の静的クラスを介して行われます。このクラスは、ほとんどのペアレンティング要件に共通する機能を提供します。
階層内で検索するための座標のオフセットや開始アイテムに基づいて、有効な親オブジェクトを見つけます。
指定されたオブジェクトが特定の型の親になることができるかどうかを判断します。
あるオブジェクトの親を別の親に変更します。また、この変更によって、オブジェクトから古い親が削除されます。この削除によって、古い親は、アイテムにそのまま残る可能性があるすべてのデータ (添付プロパティなど) を消去できます。
ModelParent クラスは、現在の親オブジェクトおよび指定された親オブジェクトの ParentAdapter クラスを検索することにより動作します。ParentAdapter クラスが存在しない場合、オブジェクトに親を割り当てることはできません。ParentAdapter クラスは、一般的なケースについていくつかのオーバーライドを定義します。たとえば、多くのオーバーライドは、GestureData オブジェクトをパラメータとして認識します。このデータ型は、コードがユーザー コマンドを処理しているときには、WPF デザイナ コマンド機構から使用できます。これにより、一般的なコンテキスト情報が提供されます。
ParentAdapter を使用することで、コンテナは親を簡単に削除できます。たとえば、Canvas コントロールを親に持つオブジェクトが、親を Grid コントロールに変更すると、オブジェクト上の Canvas コントロールの添付プロパティが自動的に削除されます。
参照
参照
Microsoft.Windows.Design.Services