基本要素の概要

Windows Presentation Foundation (WPF) のクラスの大部分は、SDK のドキュメントで一般に基本要素クラスと呼ばれている 4 つのクラスから派生しています。 このようなクラスとしては、UIElementFrameworkElementContentElementFrameworkContentElement があります。 DependencyObject クラスも関連がありますが、これは UIElementContentElement の両方に共通する基底クラスであるためです

WPF クラスの基本要素 API

UIElement および ContentElement は、どちらも DependencyObject から派生していますが、その方法は多少異なります。 このレベルでの相違点は、UIElementContentElement がユーザー インターフェイスで使用される方法と、それらがアプリケーション内で使用される目的に関するものです。 UIElement のクラス階層構造内には Visual も存在します。これは、Windows Presentation Foundation (WPF) の基礎となる低レベルのグラフィックス サポートを公開するクラスです。 Visual では、独立した四角形の画面領域を定義することにより、レンダリングのフレームワークが提供されます。 実際には、UIElement では比較的大きなオブジェクト モデルがサポートされており、四角形の画面領域として記述できる領域にレンダリングおよびレイアウトされるように設計されている要素のためのものです。そのコンテンツ モデルは、さまざまな要素の組み合わせが可能なように、意図的にオープンに作られています。 ContentElementVisual から派生していません。そのモデルでは、ContentElement は、リーダーやビューアーなど、他のものによって処理されます。これらのリーダーやビューアーなどでは、要素が解釈され、Windows Presentation Foundation (WPF) で処理される完全な Visual が生成されます。 一部の UIElement クラスは、コンテンツ ホストとなるように設計されています。それらのクラスでは、1 つ以上の ContentElement クラスに対して、ホスティングとレンダリングが提供されます (そのようなクラスの例として、DocumentViewer があります)。 ContentElement は、比較的小さなオブジェクト モデルを持ち、UIElement 内にホストされるテキスト、情報、またはドキュメントのコンテンツ向けに使用されることの多い要素の基底クラスとして使用されます。

フレームワークレベルとコアレベル

UIElementFrameworkElement の基底クラスとして機能し、ContentElementFrameworkContentElement の基底クラスとして機能します。 この次のレベルのクラスが存在する理由は、WPF フレームワーク レベルとは異なる WPF コア レベルをサポートするためです。この区分は、PresentationCore と PresentationFramework アセンブリ間での API の区分にも存在します。 WPF フレームワーク レベルは、表示のためのレイアウト マネージャーの実装など、アプリケーションの基本的ニーズに対して、より完全なソリューションを提供します。 WPF コア レベルは、アセンブリの追加によるオーバーヘッドを引き起こすことなく WPF の大部分を使用する方法を提供します。 これらのレベルの区別は、ほとんどの通常のアプリケーション開発シナリオでほとんど問題になりません。一般には、WPF API を 1 つのものと見なして、WPF フレームワーク レベルと WPF コア レベルの違いについて意識する必要はありません。 アプリケーション設計で WPF フレームワーク レベルの機能の大部分を置き換えることにした場合、たとえば開発中のソリューション全体に、独自のユーザー インターフェイス (UI) の構成およびレイアウトが既に実装されている場合には、これらのレベルの区分に関する理解が必要となる可能性があります。

派生元の要素を選択する

WPF を拡張したカスタム クラスを作成するための最も実際的な方法は、既存のクラス階層から必要な機能を可能な限り得ることのできる、いずれかの WPF クラスから派生させることです。 このセクションでは、継承元とするクラスの選択に役立つように、最も重要な要素クラスのうちの 3 つのクラスが提供する機能を示します。

コントロールを実装する場合には (WPF クラスから派生させる理由としてはこれが実際のところ最も一般的なものですが)、実用的なコントロールであるクラス、コントロール ファミリの基本クラス、または少なくとも Control 基底クラスから派生させるのが一般的です。 いくつかのガイドラインと実際の例については、「コントロールの作成の概要」を参照してください。

コントロールを作成しているのではなく、階層の上位にあるクラスから派生する必要がある場合は、各基本要素クラスに定義された特性に関するガイドを意図した、以下のセクションを参照してください。

DependencyObject から派生するクラスを作成すると、次の機能が継承されます。

  • GetValueSetValue のサポート、およびプロパティ システム全体のサポート。

  • 依存関係プロパティと、依存関係プロパティとして実装されている添付プロパティを使用する機能。

UIElement から派生するクラスを作成する場合は、DependencyObject によって提供される機能以外に、次の機能を継承します。

  • アニメーション化されたプロパティ値の基本的なサポート。 詳しくは、「 アニメーションの概要」をご覧ください。

  • 基本的な入力イベントのサポートと、コマンド実行のサポート。 詳細については、「入力の概要」および「コマンド実行の概要」を参照してください。

  • レイアウト システムに情報を提供するためにオーバーライドできる仮想メソッド。

FrameworkElement から派生するクラスを作成する場合は、UIElement によって提供される機能以外に、次の機能を継承します。

  • スタイル設定とストーリーボードのサポート。 詳細については、「Style」および「ストーリーボードの概要」を参照してください。

  • データ バインディングのサポート。 詳しくは、「 データ バインディングの概要」をご覧ください。

  • 動的リソース参照のサポート。 詳細については、「XAML リソース」を参照してください。

  • プロパティ値継承のサポート、および、データ バインディング、スタイル、またはレイアウトのフレームワークの実装などのフレームワーク サービスのプロパティに関する条件をレポートする場合に役立つ、メタデータ内の他のフラグ。 詳細については、「フレームワーク プロパティ メタデータ」を参照してください。

  • 論理ツリーの概念。 詳細については、「WPF のツリー」を参照してください。

  • レイアウトに影響を与えるプロパティの変更を検出できる OnPropertyChanged オーバーライドなど、レイアウト システムの実際的な WPF フレームワーク レベルの実装のサポート。

ContentElement から派生するクラスを作成する場合は、DependencyObject によって提供される機能以外に、次の機能を継承します。

FrameworkContentElement から派生するクラスを作成する場合は、ContentElement によって提供される機能以外に、次の機能を使用できます。

  • スタイル設定とストーリーボードのサポート。 詳細については、「Style」および「アニメーションの概要」を参照してください。

  • データ バインディングのサポート。 詳しくは、「 データ バインディングの概要」をご覧ください。

  • 動的リソース参照のサポート。 詳しくは、「XAML リソース」を参照してください。

  • プロパティ値継承のサポート、および、データ バインディング、スタイル、またはレイアウトのフレームワークの実装などのフレームワーク サービスのプロパティに関する条件をレポートする場合に役立つ、メタデータ内の他のフラグ。 詳細については、「フレームワーク プロパティ メタデータ」を参照してください。

  • レイアウト システムの変更 (たとえば ArrangeOverride) へのアクセスは継承されません。 レイアウト システムの実装は、FrameworkElement でのみ利用できます。 ただし、レイアウトに影響を与えるプロパティの変更を検出し、それらの変更を任意のコンテンツ ホストに報告できる OnPropertyChanged オーバーライドは継承されます。

さまざまなクラスに関してコンテンツ モデルがドキュメント化されています。 派生元として適切なクラスを見つける必要がある場合、クラスのコンテンツ モデルは、考慮する必要がある項目の候補の 1 つです。 詳細については、「WPF のコンテンツ モデル」を参照してください。

他の基本クラス

DispatcherObject

DispatcherObject では、WPF スレッド モデルのサポートが提供されており、WPF アプリケーション用に作成されたすべてのオブジェクトを Dispatcher に関連付けられるようになります。 UIElementDependencyObject、または Visual から派生させない場合でも、このスレッド モデルのサポートを可能にするために DispatcherObject から派生させることを検討してください。 詳細については、「スレッド モデル」を参照してください。

ビジュアル

Visual では、四角形に近い表示形式を必要とする 2D オブジェクトの概念が実装されています。 Visual の実際のレンダリングは他のクラスで行われます (単一のクラスですべての操作が完結しません) が、Visual クラスでは、レンダリング プロセスのさまざまなレベルで使用される既知の型が提供されます。 Visual ではヒット テストが実装されていますが、ヒット テストの結果を報告するイベントは公開されていません (このイベントは UIElement にあります)。 詳細については、「ビジュアル層のプログラミング」を参照してください。

Freezable

Freezable では、不変オブジェクトが必要なときやパフォーマンス上の理由で望ましいときにオブジェクトのコピーを生成する手段を提供することにより、可変オブジェクト上で不変性がシミュレートされます。 Freezable 型は、ジオメトリ、ブラシ、アニメーションなどの特定のグラフィックス要素に使用できる共通の基盤です。 FreezableVisual ではありません。これには、別のオブジェクトのプロパティ値を設定するために Freezable が適用されるときにサブプロパティとなるプロパティを格納できます。これらのサブプロパティは、レンダリングに影響することがあります。 詳細については、「Freezable オブジェクトの概要」を参照してください。

Animatable

Animatable は、Freezable 派生クラスであり、このクラスによってアニメーション コントロール層とユーティリティ メンバーが追加され、現在のアニメーション プロパティを非アニメーション プロパティから区別できるようになります。

Control

Control は、あるテクノロジではコントロールと呼ばれ、別のテクノロジではコンポーネントと呼ばれるオブジェクトの種類の基底クラスとして意図されています。 一般に WPF コントロール クラスは、UI コントロールを直接表すクラスか、コントロールの複合に密接に参加するクラスです。 Control で主に提供される機能は、コントロールのテンプレート作成です。

関連項目