過去記事
WPFを構成するものを考えてみる
XAMLとC#で作成するケースと、C#だけで作成するケースのHello worldを2つ作成しました。その過程で説明しましたが、XAMLで記述できることは、ほぼ全てC#でも記述できます。その理由についてWPFの構成するものを交えて説明します。
WPFはクラスライブラリ?
WPF = クラスライブラリというのは言い過ぎかもしれませんが、WPFはPresentationFrameworkとPresentationCoreとWindowsBaseの3つのアセンブリに入っているクラスから構成されています。WPFは、通常のCLRのクラスと同じように親をたどっていくと最終的にSystem.Objectにたどり着くクラス群から構成されています。その中に、ボタンを表すButtonクラスやウィンドウを表すWindowクラスやボタンなどのコントロールの表示位置を決めるGridクラスなど様々なものが含まれています。基本的に、これらのクラスをインスタンス化してプロパティを設定して繋いでいくことで、WPFの画面は作成できます。
XAMLは何?
WPFの画面を全てC#で記述できるということは、XAMLは不要なのでは?という疑問がわいてきます。確かにXAMLが無くてもWPFアプリケーションの作成は出来ます。XAMLは、C#で記述するよりもオブジェクトのプロパティの設定や複雑なオブジェクトの組み立てを宣言的に記述できるという点でC#より優れています。
XAMLは、オブジェクトのインスタンス化という領域に特化したドメイン固有言語という見方が出来ます。画面の構築は、基本的に画面を構成するオブジェクトのインスタンス化が主な仕事になります。C#で記述したHello worldの画面構築のコードをもう一度以下に示します。
private void InitializeComponent() { // Windowのプロパティの設定 this.Title = "MainWindow"; this.Height = 350; this.Width = 525; // Buttonの作成 this.helloWorldButton = new Button { Content = "Hello world", HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(10, 10, 0, 0), Width = 100 }; this.helloWorldButton.Click += helloWorldButton_Click; // Gridの作成 var grid = new Grid(); grid.Children.Add(this.helloWorldButton); // gridをWindowに設定 this.Content = grid; }
プロパティの設定とオブジェクトの組み立てしか行っていません。同じ画面を構築するためのXAMLのコードをもう一度以下に示します。
<Window x:Class="HelloWorld.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Button x:Name="helloWorldButton" Content="Hello world" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="100" Click="helloWorldButton_Click"/> </Grid> </Window>
Windowの下にGridがありGridの下にButtonがあるというオブジェクトの構造を端的に記述できているのはどちらになるでしょうか?個人的な主観になりますが私はXAMLに軍配があがると思います。もし、画面構築に複雑な計算ロジックが含まれるようなケース(この場合も大体はWPFに用意されているレイアウトの仕組みでカバーできることが多いです)の場合はC#で記述したほうが有利かもしれません。