基本要素の概要

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

このトピックは、次のセクションで構成されています。

  • WPF クラスの基本要素 API
  • 派生元の要素を選択する
  • 他の基本クラス
  • 関連トピック

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 内にホストされるテキスト、情報、またはドキュメントのコンテンツ向けに使用されることの多い要素の基本クラスとして使用されます。

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

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

派生元の要素を選択する

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

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

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

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

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

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

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

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

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

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

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

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

  • データ バインディングのサポート。 詳細については、「データ バインディングの概要」を参照してください。

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

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

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

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

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

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

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

  • データ バインディングのサポート。 詳細については、「データ バインディングの概要」を参照してください。

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

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

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

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

他の基本クラス

DispatcherObject

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

Visual

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

Freezable

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

Animatable

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

Control

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

参照

参照

Control

概念

依存関係プロパティの概要

コントロールの作成の概要

WPF アーキテクチャ