1粒で2度おいしい最新UIフレームワークの習得術。「WPFとSilverlightは一体何が違うのか?」このような質問を受けるならば、筆者は誤解を恐れずに「WPFとSilverlightは同じである」といいたい。OS専用とマルチプラットフォーム、デスクトップ・アプリケーションとWebアプリケーションといった具合に、その性質は大きく異なっている。UIフレームワークというスコープで見た場合、2つは“同じ”なのである。それでもさすがにまったく同じというわけにはいかない。Silverlightはランタイムのサイズを4MBytes台に抑えるという至上命令があったため、WPFと比べると機能が削られているという違いが存在する。どちらも共通のデザインの基に作られた、マイクロソフトによる最も新しく最も洗練されたUIフレームワークなのである。■1粒で2度おいしいWPFとSilverlightが“同じ”であることは、開発者にとっては大きなメリットだ。1つのUIフレームワークを学べば、WPFとSilverlightの2つのテクノロジを会得したことになるのだから、学ばない手はない。新しいテクノロジを学ぶ際に必ず付いて回るのは「まず何から手を付けたらよいのか?」という問題ではないだろうか。本連載では、筆者が「WPF/SilverlightのUIフレームワークに入門するなら、まずはこれから」と考える内容を3回にわたってお送りする予定だ。UIフレームワーク」と表記する。UIフレームワークを見ていくと、多くの部分でXAMLありきの設計となっていることに気付くはずだ。UIフレームワークを理解するうえでXAMLという言語そのものに対する知識はあまり重要ではない。UIフレームワーク入門に際して最低限必要なXAMLの言語構文を説明する。Language)は、.NETにおけるクラスのインスタンス化を宣言的に記述するXMLベースの言語である。基本的には、要素でクラスのインスタンスを、属性でプロパティ値を記述する。Basic)のコードは同じ意味を表すことになる。UIフレームワークにおけるクラスのコンストラクタXAMLではコンストラクタに引数を渡す方法が用意されていない。UIフレームワークのクラスのほとんどは、XAMLで使用されることを考慮して、パラメータなしのコンストラクタを持っている。上記の例でも、C#とVBではクラスのインスタンス化の際にオブジェクト名が必要であるのに対し、XAMLでは必要ないといった違いが存在する。XAMLとC#/VBの根本的な違いとして、XAMLはメソッドを実行できず、フロー(=順序を伴う処理)を記述できないことが挙げられる。XAMLではプロパティ値を文字列で設定するという性質上、値の自動変換が行われるという特徴がある。先ほどと同様、下記のXAMLとC#/VBのコードは同じ意味を表す。Background="#FFF1F4FB"/>プロパティ属性構文を使ってBackgroundプロパティにSolidColorBrushオブジェクトを設定するコード(XAML)Backgroundプロパティの型であるBrushクラスの1つ、SolidColorBrushクラスは、ブラシ名や16進数のARGB値(=アルファ値、赤、緑、青の順で構成される値)を示す文字列をSolidColorBrushクラスのインスタンスに変換して返す仕組みを持っている。UIフレームワークの多くのクラスや構造体で、このような文字列からの自動変換が仕組みとして用意されている。251))BackgroundプロパティにSolidColorBrushオブジェクトを設定するコード(上:C#、下:VB)各数字は10進数なので、前述の16進数と表記が異なる。16進数に対応する10進数は、FF=255、F1=241、F4=244、FB=251となる。当然ながら、文字列からの変換だけで、すべてのプロパティ値をサポートすることはできない。文字列で表現できないプロパティ値は、属性ではなく子要素として記述する方法を取る。画像をブラシとして使用するImageBrushを利用する場合、下記のようにBackgroundプロパティを<Border>要素の子要素として宣言する。ImageSource="grapecity.jpg"/></Border.Background></Border>プロパティ要素構文を使ってBackgroundプロパティにImageBrushオブジェクトを設定するコード(XAML)子要素名は[クラス名].[プロパティ名]となる。ImageBrush1BackgroundプロパティにImageBrushオブジェクトを設定するコード(上:C#、下:VB)上記のXAMLコードのように、子要素としてプロパティ値の設定を行う記述方法を「プロパティ要素構文」、要素の属性としてプロパティ値の設定を行う記述方法を「プロパティ属性構文」という。属性構文はイベント・ハンドラを登録する役割も持っている。下記のXAMLとC#/VBのコードはすべて同じ意味を表す。Button_ClickClickイベントにButton_Clickイベント・ハンドラを登録するコード(上:C#、下:VB)●名前空間WPFおよびSilverlightで使用されるXAMLコードでは、たいていの場合、下記のような記述が最上位の要素に含まれている。xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"XAMLコードの最上位の要素に含まれているXML名前空間の記述XMLでは、要素名や属性名の衝突を避けるために、各要素が属する名前空間(=XML名前空間)を「xmlns」という属性を使って指定できる。XAMLでは、このxmlns属性を使って各要素のプレフィックスに「WPF名前空間」と「XAML名前空間」の2つのXML名前空間を割り当てる。これは、C#におけるusingディレクティブ、VBにおけるImportsステートメントを思い浮かべると理解しやすいだろう。UIフレームワークの「WPF名前空間」を既定の名前空間(プレフィックスなし)として割り当てている。UIフレームワークで利用される一般的なCLR名前空間(=.NETクラス・ライブラリ内の名前空間)は、そのクラス・ライブラリにおいてXmlnsDefinitionというアセンブリ属性で結ばれている。WPFの「PresentationFramework.dll」のアセンブリ属性をツールなどで見てみると、XmlnsDefinition属性の宣言により、上記URIのWPF名前空間に、System.Windows.ControlsやSystem.Windows.Dataなど複数のCLR名前空間がマッピングされていることを確認できる。これにより、System.Windows.ControlsやSystem.Windows.DataといったCLR名前空間に属するクラスを、そのまま要素として宣言できるのである。2行目の宣言では、「XAML名前空間」を「x:」プレフィックス付きのXML名前空間として割り当てている。これにより、「x:」という文字列を要素名/属性名の前に付け加えることで、XAML名前空間に属するその要素/属性にアクセスできる。UIフレームワークはXAMLを言語として使用する1つの実装形態にすぎないが、複数の実装があるとして、それらの実装間で共通的にアクセス可能にすべき言語機能はこのXAML名前空間にまとめられている。具体的には、オブジェクトを一意に識別するための「x:Name属性」や、クラスを複数のファイルに分割する、つまり部分クラスのための「x:Class属性」などは、XAML名前空間で宣言されている)。XAML名前空間は、CLR名前空間のSystem.Windows.Markupに該当するが、XAMLの言語機能は必ずしもクラスや構造体とマッピングしているわけではない。前述のXmlnsDefinition属性を使ってXML名前空間のURIにCLR名前空間をマッピングする方法のほかに、XML名前空間のURIに直接アセンブリのCLR名前空間を指定して両者を結び付ける方法も用意されている。この方法は1つのプレフィックスに対して1つの名前空間しか割り当てることができない。この方法では、下記の定義済みトークンを使用する。定義済みトークン例えば、ClassLibrary1.dllというアセンブリのClassLibrary1というCLR名前空間を、「my:」プレフィックス付きのXML名前空間として割り当てる宣言は下記のようになる。assemblyトークンは、マップするCLR名前空間が自分自身のアセンブリ内(=XAMLファイルが存在するアセンブリ内)に存在する場合には省略可能。これでClass1というクラスがClassLibrary1名前空間にあった場合、下記のようにインスタンス化を宣言できる。<my:Class1/>定義済みトークンにより宣言したXML名前空間に所属する要素の利用例この例では、「my:」XML名前空間にマッピングされた「ClassLibrary1」CLR名前空間の「Class1」クラスのオブジェクトを要素として利用している。ほかにもXAMLにおける暗黙のルールや振る舞いはいくつか存在するが、本稿での説明はここまでとする。UIフレームワークで最初に押さえておくべきレイアウト(Panel)について説明しよう。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。