かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

WPF4.5入門 その6 「WPFを構成するものを考えてみる」

WPFを構成するものを考えてみる

XAMLC#で作成するケースと、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#で記述したほうが有利かもしれません。

WPFを構成するもののまとめ

いうことで、WPFは以下のものから構成されていることがわかりました。

  • 膨大な数のクラス群
  • 画面を構築するためのXAML

XAMLは、オブジェクトを組み立てるためのものなので、どのようなクラスがWPFにあるのかを理解し、それをXAMLで組み立てるという考えで理解していくといいと思います。