次の方法で共有


WPF デザイナーの機能拡張アーキテクチャ

[このドキュメントはプレビューのみを目的としており、以降のリリースで変更される可能性があります。プレースホルダーとして空白のトピックが含まれています。]

WPF Designer for Visual Studio は、WPF 要素および Silverlight 要素のビジュアル編集環境です。 WPF Designerは、機能拡張アーキテクチャを持つフレームワークに基づいており、独自のカスタム デザイン環境を作成するように拡張できます。

WPF Designer フレームワークを拡張することにより、WPF コンテンツと Silverlight コンテンツのデザイン時の外観と動作を大幅にカスタマイズできます。 たとえば、次のように WPF Designerを拡張できます。

  • 拡張グラフィックスで移動グリフとサイズ変更グリフをカスタマイズする。

  • コントロールの状態を変更するショートカット メニューをデザイン サーフェイスに追加する。

  • 複数のツール間でコントロールのデザイン時の外観と動作を変更する。

WPF Designerのアーキテクチャは、WPF と Silverlight の表現能力を最大限にサポートします。 これにより、以前は不可能だったビジュアル デザイン環境を構築できるようになりました。

WPF および Visual Studio のデザイン時のカスタム操作を実装する方法の例については、「チュートリアル : デザイン時装飾の作成」を参照してください。 

WPF および Silverlight のカスタム デザイン環境を作成する方法のサンプル コードについては、「WPF Designer Extensibility Samples (WPF デザイナーの機能拡張のサンプル)」のサイトを参照してください。

WPF デザイナー フレームワーク

WPF Designerのフレームワークはモジュール形式であるため、デザイン時の機能拡張を行う際、機能に必要な要素のみを拡張できます。 カスタム デザイン機能を有効にするために、多くのサポート コードを記述する必要はありません。

オブジェクト モデルは、次の表に示す 5 つの機能ユニットで構成されています。

機能ユニット

Description

編集モデル

デザイナーでのオブジェクトとのプログラミング インターフェイス。

機能プロバイダー

デザイナー フレームワークでのメイン機能拡張ポイント。

編集コンテキスト

デザイナーの状態の中央ストア。

コマンド、タスク、ツール

ユーザー入力を処理するコマンド、タスク、およびツール。

デザイン時メタデータ

実行時ロジックとデザイナー ロジックを物理的に分けるためにコントロールのデザイン時動作を格納するアセンブリ。

次の図に、WPF Designer フレームワークの機能ユニットを示します。

上位レベル オブジェクト モデル

編集モデル

デザイン環境は、編集モデルと呼ばれるプログラミング インターフェイスを介して実行時コントロールと対話します。 編集モデルは、モデル、モデルを抽象化するパブリック ラッパー、およびモデルのユーザー インターフェイス (UI) を表すビューという、3 つの機能サブユニットで構成されます。

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

ModelService クラスは、編集モデルおよびグローバル イベント通知の開始ポイントを提供します。

ViewService クラスは、ビジュアル形式を基本モデルの項目に割り当てます。

デザイナーが機能するためには、両方のサービスが必要です。 DesignerView クラスは、ユーザー入力の処理とコマンドへのルーティングを行い、ユーザー入力をモデルに正確に割り当てるために両方のサービスを必要とします。

機能プロバイダー

型のデザイン時動作を拡張するには、FeatureProvider クラスまたは FeatureConnector<TFeatureProviderType> クラスを使用します。 FeatureConnector<TFeatureProviderType> クラスは、FeatureProvider オブジェクトのリストを管理します。

FeatureProvider クラスは、最も基本的な機能拡張ポイントを提供します。 機能プロバイダーは、通常はデザイン環境から多くを必要としない簡易機能またはアドインで、特定のコンテキストで作成され、破棄されます。 機能プロバイダーは、デザイン サーフェイスに新しい UI を追加したり、基本的な動作を変更したりするのに使用されます。 たとえば、機能プロバイダーはグラブ ハンドルを追加したり、新しいマウス ドラッグ動作を提供したりします。

機能拡張性の最も深いレベルにアクセスするには、FeatureConnector<TFeatureProviderType> クラスから派生クラスを作成します。 このクラスはサービス プロバイダーを公開し、そのサービス プロバイダーを介して、機能コネクタの派生クラスはイベントの処理とサービスの要求および発行を行います。 たとえば、機能コネクタを実装して、選択 UI またはオブジェクト固有のシリアル化を提供できます。

通常は、既存の概念を拡張するために機能を実装します。 機能コネクタは、新しい概念を提供するために実装します。 詳細については、「機能プロバイダーと機能コネクタ」を参照してください。

編集コンテキスト

大量の状態情報が実行中のデザイナーで計算されます。 たとえば、デザイナーの状態には、選択されているオブジェクトや、マウスの左ボタンが押されたときに発生した動作などが含まれます。 デザイナーの状態は、必要に応じて検出できるように、一括して格納されます。 EditingContext クラスが、このデザイナー状態のリポジトリを表します。

EditingContext クラスは、状態をデータと動作の 2 つのカテゴリに分類します。 データはコンテキスト項目のテーブルとして格納され、動作はサービスのテーブルとして格納されます。 両方のテーブルは、型ベースのキーでインデックスが付けられ、列挙できます。

ContextItem クラスは、デザイナーの 1 つの状態のみを保持します。 コンテキスト項目は不変ですが、新しいコンテキスト項目が既存のコンテキスト項目に置き換わることによって変化が表現されます。

サービスは Services プロパティを介してアクセスされます。このプロパティは、ServiceManager のインスタンスを返します。コンテキスト項目は Items プロパティを介してアクセスされます。このプロパティは、ContextItemManager のインスタンスを返します。

コマンド、タスク、ツール

WPF Designer ツール アーキテクチャは、コマンド、タスク、およびツールで構成されます。 

コマンドは、特定の動作を表す一意の識別子です。 たとえば、[切り取り] は、現在のテキストを切り取って、クリップボードに追加するコマンドです。 [切り取り] を実装するコードはアプリケーションごとに異なり、また同じアプリケーション内においても異なります。 たとえば、Word 文書内のテキストの切り取りは、同じ文書の検索テキスト ボックス内のテキストの切り取りとは異なる実装になります。 [切り取り] コマンドは、実装には関係なく同じです。

WPF Designerは、ツール コマンドの概念を導入することによって、WPF コマンド システムを補強します。 ツール コマンドは ICommand インターフェイスを実装します。これは、RoutedCommand クラスと似ています。

タスクは、コマンド バインディングのコレクションで、このタスクを使用してルーティング コマンドを追加できます。 DesignerView クラスは、ツール コマンドと同じルーティング方法を使用するコードを含み、タスクで定義されているルーティング コマンドを検出および実行します。 DesignerView クラスは、Copy などの一般的な WPF コマンドをサポートするタスクを有効にします。

ツールは、ユーザー入力を処理するクラスです。 すべてのユーザー入力が、1 回以上の入力イベントとしてデザイナーに入力されます。 これらの入力イベントは、現在のアクティブ ツールに渡され、渡された入力イベントは入力バインディングに変換されます。 入力バインディングが返されると、そのバインディング内のコマンドが実行されます。

ツールはデザイナーのグローバル モードを表します。 たとえば、ユーザーがデザイン サーフェイス上のコンポーネントを選択すると、現在のアクティブ ツールが選択を処理する入力バインディングとコマンドを提供するため、選択モードになります。 ユーザーがコントロールのインスタンスを新しく作成すると、別のツールがアクティブになり、同じ入力バインディングにバインドされている別のコマンド セットが使用できるようになります。

デザイン時メタデータ

WPF Designer フレームワークでは、コントロールのデザイン時動作を定義するメタデータは属性によって指定され、別のアセンブリに組み込まれます。 デザイナーが異なる場合は、異なるメタデータ アセンブリが使用され、そのデザイン時実装もまったく異なります。 これにより、実行時動作とデザイン時動作を分離して、デザイナーとコントロールを個別に変更できます。

デザイン時実装を提供するアセンブリを指定するには、アセンブリに ProvideMetadataAttribute を設定し、IProvideAttributeTable インターフェイスを実装するクラスを含めます。

詳細については、「デザイン時メタデータの提供」を参照してください。

Expression Blend でのデザイン時サポート

WPF Designerは、機能拡張フレームワークのすべての機能をサポートしています。 Expression Blend は、次の機能をサポートしています。

  • Adorner

  • コンテキスト メニュー

  • DesignModeValueProvider

  • 既定の初期化子

  • 選択や操作など、ModelItem のすべての機能

  • プロパティ ウィンドウの拡張機能

Expression Blend は、ParentAdapter および PlacementAdapter をサポートしていません。

WPF デザイナーのアセンブリ

WPF Designerは、複数のアセンブリで構成されます。それぞれ、パブリック、プライベート、またはデザイナー固有のいずれかのカテゴリのアセンブリです。

パブリック アセンブリは、デザイン時ロジックをコントロールに追加する際に使用できるクラスを公開します。

プライベート アセンブリとデザイナー固有のアセンブリは、WPF Designerの機能セットと、Visual Studio や Expression Blend などのデザイナーとの対話を定義します。

WPF および Silverlight デザイナーは、単一のエンティティとしてインストールされます。 デザイナーごとに個別のパッケージは用意されていません。

次の表に、WPF Designer機能の展開方法を示します。

Assembly

パブリック API

Description

Microsoft.Windows.Design.Extensibility.dll

属性と Visual Studio SDK 統合ロジックを介して、機能拡張モデルを提供します。

Microsoft.Windows.Design.Interaction.dll

ユーザー入力と表示クラスを提供します。

Microsoft.Windows.Design.Markup.dll

XAML とドキュメント モデル機構を提供します。

Microsoft.VisualStudio.Xaml.dll

サービス、データ バックプレーン、およびメタデータ操作を介して、任意のデザイナーに対する基本的な XAML 基盤を提供します。

Microsoft.Windows.Design.Host.dll

デザイナーをホストするためのプライベート API (Visual Studio 固有)。

Microsoft.Windows.Design.Developer.dll

WPF Designerの実装。

Microsoft.Windows.Design.Developer.WPF.dll

Microsoft.Windows.Design.Developer.Silverlight.dll

Microsoft.Windows.Design.Platform.dll

抽象クラスを含むプラットフォーム レイヤー。 プラットフォーム実装では、このアセンブリに抽象クラスを実装します。

Microsoft.Windows.Design.Platform.WPF.dll

WPF のプラットフォーム固有デザイン時。

Microsoft.Windows.Design.Platform.Silverlight.dll

Silverlight のプラットフォーム固有デザイン時。

Microsoft.Expression.DesignModel.dll

Silverlight のデザイン時アセンブリ。

Microsoft.Expression.Platform.WPF.dll

Silverlight のデザイン時アセンブリ。

Microsoft.Expression.Platform.Silverlight.dll

Silverlight のデザイン時アセンブリ。

注意

アセンブリは、名前空間の範囲を表しているのではなく、機能的な範囲を表しています。複数のアセンブリにまたがる名前空間も珍しくありません。

WPF デザイナーと Windows フォーム デザイナーのアーキテクチャ

WPF Designerのアーキテクチャは、IComponent インターフェイスと System.ComponentModel 名前空間で識別される Windows フォーム デザイナーのアーキテクチャとは大きく異なります。 詳細については、「Windows フォーム デザイナーのフレームワークと WPF デザイナーのフレームワークの比較」を参照してください。

参照

概念

デザイン時メタデータの提供

機能プロバイダーと機能コネクタ

その他の技術情報

デザイン時の Windows フォーム コントロールの開発

WPF デザイナーの機能拡張