WisdomSoft - for your serial experiences.

2.4 コンテンツ

任意のコンテンツを保有し表示する ContentControl クラスを紹介します。また、このクラスの機能を用いてウィンドウ上にテキストを表示します。

2.4.1 コンテンツの設定と表示

Windows では、ウィンドウを表示してマウスなどで操作することができるグラフィカルな GUI アプリケーションが表示する、ボタン、ラベル、チェックボックス、リスト、コンボボックス、テキスト入力フィールドなどを総称してコントロールと呼んでいます。コントロールは、ユーザーに何らかの情報を表示したり、列挙している情報から選択、入力、またはその他のアクションを受けることができます。

WPF では、こうしたコントロールが表示する内容を総称してコンテンツと呼んでいます。例えば、ボタンが表示するテキストやアイコンはコンテンツであると考えることができますし、トップのウィンドウが保有している様々なコントロール郡(ボタンやラベル、リスト、コンボボックス)などもコンテンツであると考えることができます。

従来の GUI プログラミング モデルとは異なり、WPF では、様々な描画要素を全てコンテンツという形で統一しています。これによって、コントロールやイメージ、テキスト、図形などを、全て同様の方法で扱えるようになりました。

コンテンツは System.Windows.Controls.ContentControl クラスによって保有、表示されます。

System.Windows.Controls.ContentControl クラス
System.Object
   System.Windows.Threading.DispatcherObject
     System.Windows.DependencyObject
       System.Windows.Media.Visual
         System.Windows.UIElement
           System.Windows.FrameworkElement
             System.Windows.Controls.Control
              System.Windows.Controls.ContentControl
[LocalizabilityAttribute(LocalizationCategory.None, Readability=Readability.Unreadable)] 
[ContentPropertyAttribute("Content")] 
public class ContentControl : Control, IAddChild

ContentControl クラスは、コンテンツを保有し、表示することができるコントロールのルートクラスです。このクラスのインスタンスは、コンテンツを表示する 1 つのコントロールに対応します。前述したサンプルで何度も表示したウィンドウは、ContentControl クラスの派生クラスです。

ContentControl クラスは、コンテンツを設定・取得することができる Content プロパティを公開しています。ContentControl に表示するコンテンツは、このプロパティに設定してください。

ContentControl クラス Content プロパティ
[BindableAttribute(true)] 
public Object Content { get; set; }

Content プロパティは Object 型なので、構文上はどのようなオブジェクトも設定することができますが、実質的には ContentControl がコンテンツとして処理できるオブジェクトを設定しなければなりません。ContentControl クラスは、単純な string 型のテキストデータと System.Windows.UIElement クラスの両方をサポートしています。

System.Windows.UIElement クラス
System.Object
   System.Windows.Threading.DispatcherObject
     System.Windows.DependencyObject
       System.Windows.Media.Visual
        System.Windows.UIElement
public class UIElement : Visual, IAnimatable, IInputElement

UIElement クラスは、WPF で表示されるオブジェクトの基本的な要素となるルートクラスです。UIElement では、描画要素の領域や可視性などを表す基本的なプロパティと、マウス入力などに対応する基本的なイベントを公開しています。このクラスの詳細については、後ほど解説します。

Content プロパティには、UIElement を継承する任意の描画要素を指定することができますが Window クラスのオブジェクトはルートとして使われなければならないので、Window オブジェクトをコンテンツとして設定することはできません。Window オブジェクトをコントロールのコンテンツとして表示しようとした場合、実行時例外が発生します。

まずは、コントロールなどを使わないで、最も単純なテキストだけを使ったコンテンツを表示してみましょう。

コード1
using System;
using System.Windows;

class Test {
	[STAThread]
	public static void Main() {
		Window wnd = new Window();
		wnd.Content = "Kitty oh your lap";

		Application app = new Application();
		app.Run(wnd);
	}
}
実行結果
コード1 実行結果

コード1は、表示する Window オブジェクトの Content プロパティに文字列を設定しています。この場合、コントロールは指定された文字列を純粋にテキストとして表示します。実行結果を見ると、ウィンドウの左上隅に、指定されたテキストが表示されています。

より複雑なコンテンツを表示したい場合は、様々な UIElement の派生クラスや、ContentControl のレイアウト方法を学習しなければなりません。よりリッチなコンテンツの配置方法は、今後、順を追って解説していきます。