WPF のコンテンツ モデル
Windows Presentation Foundation (WPF) は、コンテンツのさまざまな種類の表示が主な目的である、数多くのコントロール型やコントロールに似た型を提供するプレゼンテーション プラットフォームです。 使用するコントロールまたは派生元として使用するコントロールを決定するには、各コントロールで最適に表示できるオブジェクトの種類を理解しておくことが重要です。
このトピックでは、WPF コントロール型とコントロールに似た型のコンテンツ モデルについて説明します。 コンテンツ モデルでは、コントロールで使用できるコンテンツが表されます。また、各コンテンツ モデルのコンテンツ プロパティについても示します。 コンテンツ プロパティは、オブジェクトのコンテンツの格納に使用されるプロパティです。
このトピックは、次のセクションで構成されています。
- 任意のコンテンツを格納するクラス
- UIElement オブジェクトのコレクションを格納するクラス
- UIElement の外観に影響するクラス
- UIElement の視覚的フィードバックを提供するクラス
- ユーザーがテキストを入力できるようにするクラス
- テキストを表示するクラス
- テキストの書式を設定するクラス
- 関連トピック
任意のコンテンツを格納するクラス
コントロールの中には、文字列、DateTime オブジェクト、追加項目のコンテナーである UIElement など、任意の型のオブジェクトを格納できるものがあります。 たとえば、Button にはイメージおよびテキストを格納できます。また、CheckBox には DateTime.Now の値を格納できます。
WPF には、任意のコンテンツを格納できるクラスが 4 つあります。 Control から継承するクラスの一覧を次の表に示します。
任意のコンテンツを格納するクラス |
コンテンツ |
---|---|
単一の任意のオブジェクト。 |
|
任意のオブジェクトであるヘッダーと単一の項目。 |
|
任意のオブジェクトのコレクション。 |
|
任意のオブジェクトであるヘッダーと項目のコレクション。 |
これらのクラスから継承するコントロールは、同じ型のコンテンツを格納することができ、そのコンテンツを同じ方法で扱うことができます。 次の図は、イメージやテキストを格納する各コンテンツ モデルのコントロールを示しています。
単一の任意のオブジェクトを格納するコントロール
ContentControl クラスには、任意のコンテンツの 1 つが格納されます。 コンテンツ プロパティは Content です。 次に示すのは ContentControl から継承し、そのコンテンツ モデルを使用するコントロールです。
次の図は、Content が文字列、DateTime オブジェクト、Rectangle、および Panel (Ellipse と TextBlock を格納する) が設定された 4 つのボタンを示しています。
異なる型のコンテンツを持つ 4 つのボタン
Content プロパティの設定方法の例については、ContentControl のトピックを参照してください。
ヘッダーおよび単一の任意のオブジェクトを格納するコントロール
ContentControl から継承される HeaderedContentControl クラスは、ヘッダーを使用してコンテンツを表示します。 コンテンツ プロパティ Content を ContentControl から継承し、Object 型の Header プロパティを定義します。その結果、ヘッダーとコンテンツの両者が任意のオブジェクトとなることができます。
次に示すのは HeaderedContentControl から継承し、そのコンテンツ モデルを使用するコントロールです。
次の図に、2 つの TabItem オブジェクトを示します。 1 つ目の TabItem には UIElement オブジェクトが Header および Content として付いています。 Header は Ellipse と TextBlock を格納する StackPanel に設定されています。 Content は TextBlock と Label を格納する StackPanel に設定されています。 2 つ目の TabItem の場合、Header には文字列、Content には TextBlock が付いています。
Header プロパティで異なる型を使用する TabControl
TabItem オブジェクトを作成する方法の例については、HeaderedContentControl のトピックを参照してください。
任意のオブジェクトのコレクションを格納するコントロール
Control から継承する ItemsControl クラスには、文字列、オブジェクト、他の要素などの複数の項目を格納できます。 このクラスのコンテンツ プロパティは ItemsSource と Items です。 ItemsSource は通常、データ収集時に ItemsControl を取得するために使用されます。 コレクションを使用して ItemsControl を取得しない場合は、Items プロパティを使用して項目を追加できます。
次に示すのは ItemsControl から継承し、そのコンテンツ モデルを使用するコントロールです。
次の図は、これらの型の項目を含む ListBox を示しています。
さまざまな種類のオブジェクトを格納する ListBox
ヘッダーと任意のオブジェクトのコレクションを格納するコントロール
ItemsControl から継承する HeaderedItemsControl クラスには、文字列、オブジェクト、ヘッダー、他の要素などの複数の項目を格納できます。 このクラスは ItemsControl のコンテンツ プロパティである ItemsSource と Items を継承し、任意のオブジェクトとなるように Header プロパティを定義します。
次に示すのは HeaderedItemsControl から継承し、そのコンテンツ モデルを使用するコントロールです。
UIElement オブジェクトのコレクションを格納するクラス
Panel クラスは、子である UIElement オブジェクトの配置および配列を行います。 コンテンツ プロパティは Children です。
次に示すのは Panel クラスから継承し、そのコンテンツ モデルを使用するクラスです。
詳細については、「パネルの概要」を参照してください。
UIElement の外観に影響するクラス
Decorator クラスは、単一の子である UIElement 上またはその周囲に視覚的な効果を適用します。 コンテンツ プロパティは Child です。 次に示すのは Decorator から継承し、そのコンテンツ モデルを使用するクラスです。
周囲を Border で装飾した TextBox を次の図に示します。
境界線のある TextBlock
UIElement の視覚的フィードバックを提供するクラス
Adorner クラスは、ユーザーに視覚上の手掛かりを示します。 たとえば、Adorner を使用すると、要素に機能ハンドルを追加したり、コントロールに関する状態情報を提供したりできます。 Adorner クラスでは、独自の装飾を作成できるようにするフレームワークが用意されています。 WPF では、実装済みの装飾は用意されていません。 詳細については、「装飾の概要」を参照してください。
ユーザーがテキストを入力できるようにするクラス
WPF には、ユーザーがテキストを入力できるようにするための主要なコントロールが 3 つ用意されています。 各コントロールは、テキストをそれぞれの形式で表示できます。 次の表に、これら 3 つのテキスト関連のコントロールを、テキストの表示形式およびテキストを格納するプロパティと共に示します。
コントロール |
テキストの表示形式 |
コンテンツ プロパティ |
---|---|---|
書式なしテキスト |
||
書式設定されたテキスト |
||
非表示のテキスト (マスクされた文字) |
テキストを表示するクラス
書式なしのテキストまたは書式設定されたテキストを表示できるクラスはいくつかあります。 短いテキストを表示する場合は、TextBlock を使用します。 長いテキストを表示する場合は、FlowDocumentReader コントロール、FlowDocumentPageViewer コントロールまたは FlowDocumentScrollViewer コントロールを使用します。
TextBlock には、Text および Inlines という 2 つのコンテンツ プロパティがあります。 表示するテキストに一貫性のある書式を適用する場合は、Text プロパティの使用が適しています。 テキスト全体で異なる書式を使用する場合は、Inlines プロパティを使用します。 Inlines プロパティは、テキストの書式を指定する Inline オブジェクトのコレクションです。
FlowDocumentReader、FlowDocumentPageViewer、および FlowDocumentScrollViewer クラスのコンテンツ プロパティを次の表に示します。
コントロール |
コンテンツ プロパティ |
コンテンツ プロパティの型 |
---|---|---|
Document |
||
Document |
||
Document |
FlowDocument では IDocumentPaginatorSource インターフェイスを実装します。このため、3 つのクラスはすべて FlowDocument をコンテンツとして受け取ることができます。
テキストの書式を設定するクラス
TextElement およびその関連クラスでは、テキストの書式を設定できます。 TextElement オブジェクトには、TextBlock オブジェクトおよび FlowDocument オブジェクトでテキストを格納し、その書式を設定できます。 TextElement オブジェクトの主要な型は Block 要素および Inline 要素の 2 つです。 Block 要素は、段落や一覧などの 1 つのテキスト ブロックを表します。 Inline 要素は、ブロック内のテキストの部分を表します。 多くの Inline クラスでは、テキストに適用される書式を指定します。 それぞれの TextElement には独自のコンテンツ モデルがあります。 詳細については、「TextElement コンテンツ モデルの概要」を参照してください。