XAMLファイルの詳細 |
これまでに我々は、Longhornアプリケーションおよびコンポーネントを構築する方法について学んできた。以下では、XAMLファイルを.NETクラスに変化させるときに、ビルドシステムが何を行うのかを含め、XAMLファイルの詳細について見ていこう。
XAMLファイルは1つのクラス宣言である。アプリケーション定義ファイルは、アプリケーションのApplicationオブジェクトのクラスを定義するXAMLファイルである。しかし一般的には、XAMLドキュメントはクラス定義を行うファイルである。XAMLファイルの定義によって生成されるクラスは、XMLドキュメントのルート要素名に関連付けられているクラスを継承する。デフォルトでは、ビルドシステムは生成されるクラス名としてXAMLベースのファイル名を使用する。
次のステップは、アプリケーション操作のための定義ファイルの生成である。Type属性がApplicationDefinitionに設定されているItem要素は、Applicationオブジェクトを定義するXAMLファイルの名前を指定する。言いかえれば、この要素はアプリケーションに関するエントリポイントを含むXAMLファイルを指定する。Longhornプラットフォームは、このファイルに定義されるMSAvalon.Windows.Applicationを継承する型のインスタンスを生成し、アプリケーションの開始と終了および、ナビゲーションを管理させる。
以下のXAMLファイルは、マークアップを使用してプロジェクトのApplicationオブジェクトを定義している。
<NavigationApplication xmlns= "http://schemas.microsoft.com/2003/xaml" StartupUri="HelloWorld.xaml" /> |
ほとんどのLonghornアプリケーションは、ナビゲーションベースのアプリケーションであるため、標準のNavigationApplicationオブジェクトを再利用することになるだろう。StartupUri属性の値を変更するだけで、ほとんどのナビゲーションベースのアプリケーションに対して、このアプリケーション定義ファイルを再利用できる。
例えば、HelloWorldApplication.xamlファイル内に以前のアプリケーション定義を記録している状況で、前述のHelloWorld.projを使用する場合、ビルドシステムは次のクラス宣言を生成する。
namespace IntroLonghorn { class HelloWorldApplication : MSAvalon.Windows.Navigation.NavigationApplication { : : { } |
名前空間は、プロジェクトファイルのDefaultClrNameSpace宣言から得られ、宣言されたクラス名はベースファイル名と同じになる。また、宣言されたクラスは、XAMLファイルのルート要素により表現されるクラスを継承する。
次は、属性を使って生成されたコードの最適化である。XAMLファイルでルート要素を宣言するとき、ルート要素の属性を使用して生成されるクラス宣言の名前を制御できる。ここで使用できる属性には次の3種類がある。
(a)名前空間のプリフィックス定義:プリフィックスをDefinitionという名前空間に関連付ける
(b)Language属性:Definition名前空間内で定義され、XAMLファイルのインラインコードに利用されるプログラミング言語を指定する
(c)Class属性:Definition名前空間内で定義され、生成させるクラスの名前を指定する
なお、LanguageおよびClass属性を使うためには、Definition名前空間に対するプリフィックスの定義が必要で、伝統的なdefプリフィックスが使用される。また、指定する名前に「.」が含まれる時には、ビルドシステムはDefaultClrNameSpaceを用いた名前のプリフィックスを付けなくなる。
例として、HelloWorldApplication.xamlファイルの内容を次のように変更してみる。
<NavigationApplication xmlns="http://schemas.microsoft.com/2003/xaml" xmlns:def="Definition" def:Class="Special.MyApp" def:CodeBehind= "HelloWorldApplication.xaml.cs" StartupUri="HelloWorld.xaml" /> |
これにより、次のようなクラスが生成される。
namespace Special { class MyApp : MSAvalon.Windows.Navigation.NavigationApplication { : : } } |
ほぼすべてのアプリケーションで、ユーザーインタフェースを指定するマークアップのほかに、ボタンクリックイベントのイベントハンドラや仮想メソッドの書き換えなど、何らかのコードを記述する必要がある。では、ナビゲーションを持たないアプリケーションの生成による、アプリケーションコードとマークアップを組み合わせる方法について考えてみよう。
ここで私が強調したいのは、非ナビゲーションベースのアプリケーションの作成を強要する理由が、現実にはないことだ。ただし、別のページに移動することがないナビゲーションベースのアプリケーションを作成することは可能だ。このようなアプリケーションを作成するには、同じクラスにコードとマークアップを混在させなければならないので、例題としては最適である。
非ナビゲーションベースのアプリケーションを作成するには、MSAvalon.Windows.Applicationを継承し、OnStartingUpメソッドを上書きする、カスタムクラスを定義する必要がある。アプリケーション定義ファイルはプログラムが使用するアプリケーションオブジェクトクラスを宣言する。このため、非ナビゲーションベースのアプリケーションは、上書きするOnStartingUpメソッドを同じクラスで定義する必要がある。
非ナビゲーションベースのアプリケーションのアプリケーション構成ファイルは、次の2つの例外を除けば、ナビゲーションベースのアプリケーションの定義ファイルと同じアイテムが含まれる。
1つのクラスを実装するためにマークアップとコードを使用する必要があるので、ソースコードファイルをXAMLファイルに関連付ける方法を説明する必要がある。
マークアップを使用してアプリケーションの一部を開発し、従来型のプログラミング言語でアプリケーションの別の部分を開発するといったことはよくあることだ。そのため、ユーザーインタフェースの部分とロジック部分を、別のソースファイルとして分離することを強く推奨する。
Definition名前空間で定義されたXAMLのCodeBehind要素をXAMLファイルのルート要素に追加し、コードビハインドファイルとも呼ばれるソースコードファイルの名前を指定できる。ビルドエンジンは、XAMLの宣言をマネージドクラスへとコンパイルし、コードビハインドファイルをマネージドクラス宣言にコンパイルする。ここでややこしいのは、2つのクラス定義が、同じクラスの宣言の一部であることである。
以下は、非ナビゲーションベースのアプリケーションクラスを生成するXAML定義である
<Application xmlns= "http://schemas.microsoft.com/2003/xaml" xmlns:def="Definition" def:Language="C#" def:Class= "IntroLonghorn.CodeBehindSample" def:CodeBehind= "CodeBehind.xaml.cs" /> |
このアプリケーション定義ファイルに関しては、2つの注意点がある。
これに対応するソースビハインドファイルはコラム5のようになる。
コードビハインドファイルのクラス宣言における、部分的なキーワードに注意してほしい。 このキーワードは、コンパイル時に、このクラス定義が同じクラスのほかの定義とマージされることを明記している。これにより、1つのクラスにおける部分的な定義を、それぞれの別のソースファイルで提供し、コンパイル時に生成されるアセンブリで、それらを1つのクラス定義にまとめることができる。
namespace IntroLonghorn { using System; using MSAvalon.Windows; using MSAvalon.Windows.Controls; using MSAvalon.Windows.Media; public partial class CodeBehindSample { MSAvalon.Windows.Controls.SimpleText txtElement; MSAvalon.Windows.Window mainWindow; protected override void OnStartingUp (StartingUpCancelEventArgs e) { base.OnStartingUp (e); CreateAndShowMainWindow (); } private void CreateAndShowMainWindow () { // Create the application's main window mainWindow = new MSAvalon.Windows.Window (); // Add a dark red, 14 point, "Hello World!" //text element txtElement = new MSAvalon.Windows.Controls.SimpleText (); txtElement.Text = "Hello World!"; txtElement.Foreground = new MSAvalon.Windows.Media.SolidColorBrush (Colors.DarkRed); txtElement.FontSize = new FontSize (14, FontSizeType.Point); mainWindow.Children.Add (txtElement); mainWindow.Show (); } } } |
© Copyright 2001-2005 Fawcette Technical Publications