かずきのBlog@hatena

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

WPF4.5入門 その5 「全てC#でHello world」

全てC#Hello world

XAMLC#を使ってHello worldアプリケーションを作成しました。ここでは、このHello worldアプリケーションをC#のみで作成します。通常は、画面はXAMLで記述しますしXAMLで記述することを推奨します。ただ、XAMLで書けることは、ほぼ全てC#で記述できます。
C#でクラス ライブラリのプロジェクトを新規作成します。ここではCodeHelloWorldという名前で作成しました。参照設定にWPFで必要な以下の4つの参照を追加します。

  • PresentationCore
  • PresentationFramework
  • WindowsBase
  • System.Xaml

MainWindowという名前のクラスを作成して、Windowクラスを継承させます。

namespace CodeHelloWorld
{
    using System.Windows;
 
    class MainWindow : Window
    {
    }
}

Hello worldアプリケーションで作成した画面をコードで組み立てます。InitializeComponentというメソッド内でWindow内のコントロールを組み立てています。基本的にXAMLで設定している内容と1対1に対応していることが確認できます。

namespace CodeHelloWorld
{
    using System.Windows;
    using System.Windows.Controls;
 
    class MainWindow : Window
    {
        private Button helloWorldButton;
 
        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;
        }
 
        public MainWindow()
        {
            this.InitializeComponent();
        }
 
        private void helloWorldButton_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Hello world");
        }
    }
}

MainWindowクラスが出来たのでAppクラスを作成します。XAMLを使ったAppクラスではStartupUriで開始時に表示するWindowのXAMLURIを指定していましたが、ここではXAMLを使っていないのでMainWindowの表示をAppクラスのStartupイベントで明示的に行っています。

namespace CodeHelloWorld
{
    using System;
    using System.Windows;
 
    class App : Application
    {
        private void InitializeComponent()
        {
            // StartupUriは使えないのでStartupイベントを使う
            this.Startup += App_Startup;
        }
 
        private void App_Startup(object sender, StartupEventArgs e)
        {
            // ウィンドウを作成して表示させるコードを明示的に書く
            var w = new MainWindow();
            w.Show();
        }
 
        [STAThread]
        public static void Main(string[] args)
        {
            // Appクラスを作成して初期化して実行
            var app = new App();
            app.InitializeComponent();
            app.Run();
        }
    }
}

一通りのクラスが出来たので、プロジェクトのプロパティをクラスライブラリからWindowsアプリケーションに変更して実行します。実行すると、XAMLを使った時とおなじ見た目と動作のアプリケーションが起動します。

ここで伝えたかったのは、C#のコードでもXAMLでも同じようにWPFのアプリケーションが作れるという点です。そのことを知ったうえで、XAMLの特性を理解し、どういうときにXAMLで記述し、どういうときにC#で記述すべきなのかということを考えることが必要だということを意識して今後を読み進めてください。