C#で始めるWindowsデスクトップアプリ開発:WPFとWinForms

これまでの学習でC#の基本的なプログラミングスキルが身につきましたね。ここからは、皆さんが普段使っているような、ボタンやテキストボックスなどのグラフィカルな画面(GUI)を持つWindowsデスクトップアプリケーションの作成方法について学びましょう。C#では主にWindows Forms (WinForms)Windows Presentation Foundation (WPF) という2つの技術が使われます。

1. Windowsデスクトップアプリとは?

Windowsデスクトップアプリは、Windowsオペレーティングシステム上で直接動作するアプリケーションのことです。Webブラウザやインターネット接続がなくても利用でき、OSの機能やローカルのファイルシステムに直接アクセスできるのが特徴です。

特徴

2. WinFormsとWPF:どちらを選ぶべきか?

C#でデスクトップアプリを開発する主要なフレームワークとして、WinFormsとWPFがあります。それぞれの特徴を理解し、適切な方を選びましょう。

2.1. Windows Forms (WinForms)

WinFormsは、最も古くからあるWindowsデスクトップアプリ開発のフレームワークです。Visual Studioのデザイナーでドラッグ&ドロップにより直感的にGUIを構築でき、学習コストが低いのが特徴です。

2.2. Windows Presentation Foundation (WPF)

WPFは、WinFormsの後継として開発された、よりリッチで表現力豊かなUIを作成するためのフレームワークです。XAML(ザムル)というXMLベースの言語でUIを記述するのが特徴です。

どちらを選ぶべきか?

  • 初心者がデスクトップアプリ開発の基礎を学ぶなら、まずはWinFormsから始めるのがおすすめです。 GUIの仕組みやイベント処理の概念を掴みやすいでしょう。
  • よりモダンでリッチなUIを作成したい、または将来的に高度なアプリケーション開発を目指すなら、WPFに挑戦することをお勧めします。 学習コストは高めですが、その分できることも多く、市場のニーズも高いです。

3. WinFormsアプリ開発の基本ステップ

ここでは、WinFormsを使って簡単なGUIアプリを作成する手順を見ていきましょう。

3.1. プロジェクトの作成

  1. Visual Studioを開き、「新しいプロジェクトの作成」を選択します。
  2. 検索ボックスに「Windowsフォーム アプリ (.NET Framework)」と入力し、C#言語のテンプレートを選択して「次へ」をクリックします。
  3. プロジェクト名(例: MyWinFormsApp)と場所を指定し、「作成」をクリックします。

プロジェクトが作成されると、Visual Studioにデザイナ画面が表示され、フォーム(ウィンドウ)が1つ表示されます。

3.2. コントロールの配置とイベント処理

簡単なメッセージ表示アプリを作成してみましょう。

  1. コントロールの配置:
    • Visual Studioの左側にある「ツールボックス」を開きます。
    • 「Common Controls」カテゴリから以下のコントロールをフォームにドラッグ&ドロップします。
      • TextBox: ユーザーが文字を入力する部分
      • Button: クリックできるボタン
      • Label: テキストを表示する部分
    • 配置後、各コントロールを選択し、右下にある「プロパティ」ウィンドウで名前やテキストなどを設定します。
      • TextBox1NametextBoxNameに、Textを空に。
      • Button1NamebuttonGreetに、Text「挨拶」に。
      • Label1NamelabelMessageに、Textを空に。
  2. イベントハンドラの記述:
    • フォームのデザイン画面で、配置した「挨拶」ボタン (buttonGreet) をダブルクリックします。
    • これにより、コードエディタが開き、ボタンがクリックされたときに実行されるメソッド (イベントハンドラ) が自動的に生成されます。
    • // Form1.cs (一部抜粋)
      public partial class Form1 : Form
      {
          public Form1()
          {
              InitializeComponent();
          }
      
          private void buttonGreet_Click(object sender, EventArgs e)
          {
              // ここにボタンがクリックされた時の処理を書く
              string name = textBoxName.Text; // textBoxNameに入力されたテキストを取得
      
              if (string.IsNullOrEmpty(name))
              {
                  labelMessage.Text = "名前を入力してください!";
              }
              else
              {
                  labelMessage.Text = $"こんにちは、{name}さん!"; // labelMessageにテキストを設定
              }
          }
      }
                              

3.3. アプリケーションの実行

Visual Studioのツールバーにある「デバッグ開始」(緑色の再生ボタン)をクリックするか、F5キーを押すと、作成したアプリが実行されます。テキストボックスに名前を入力し、ボタンをクリックして動作を確認しましょう。

4. WPFアプリ開発の基本ステップ(概念とXAML)

WPFでは、UIの記述にXAMLを使います。WinFormsとは異なる考え方でUIを構築します。

4.1. プロジェクトの作成

  1. Visual Studioを開き、「新しいプロジェクトの作成」を選択します。
  2. 検索ボックスに「WPF アプリケーション (.NET)」または「WPF アプリ (.NET Framework)」と入力し、C#言語のテンプレートを選択して「次へ」をクリックします。
  3. プロジェクト名(例: MyWPFApp)と場所を指定し、「作成」をクリックします。

プロジェクトが作成されると、MainWindow.xamlとそのコードビハインドファイルMainWindow.xaml.csが生成されます。.xamlファイルには、UIのレイアウトやコントロールを記述します。

4.2. XAMLによるUI定義

XAMLはXMLベースのマークアップ言語です。UI要素をタグで記述し、見た目を定義します。

<Window x:Class="MyWPFApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="はじめてのWPFアプリ" Height="200" Width="300">
    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Label Grid.Row="0" Grid.Column="0" Content="あなたの名前:" VerticalAlignment="Center"/>
        <TextBox x:Name="textBoxName" Grid.Row="0" Grid.Column="1" Margin="5" />

        <Button Grid.Row="1" Grid.ColumnSpan="2" Content="挨拶" Margin="5" Click="Button_Click"/>
        
        <Label x:Name="labelMessage" Grid.Row="2" Grid.ColumnSpan="2" Content="" VerticalAlignment="Center" HorizontalAlignment="Center"/>
    </Grid>
</Window>
            

4.3. コードビハインドの記述

XAMLで定義したUIの背後で動作するC#コードです。

// MainWindow.xaml.cs (一部抜粋)
using System.Windows; // MessageBoxなどを使うために必要

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent(); // XAMLで定義されたUIを初期化
    }

    // XAMLで指定したイベントハンドラ
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        string name = textBoxName.Text; // x:Nameで指定したコントロールを直接参照

        if (string.IsNullOrEmpty(name))
        {
            labelMessage.Content = "名前を入力してください!"; // LabelのContentプロパティ
        }
        else
        {
            labelMessage.Content = $"こんにちは、{name}さん!";
        }
    }
}
            

WPFでは、WinFormsとは異なり、TextプロパティではなくContentプロパティでテキストを設定することが多いです(コントロールの種類によって異なります)。

4.4. データバインディング(WPFの強力な機能)

WPFの大きな特徴の一つが強力なデータバインディングです。これにより、UIとC#のデータを自動的に同期させることができます。

<!-- MainWindow.xaml -->
<Grid Margin="10">
    <TextBox Text="{Binding UserName, Mode=TwoWay}" Width="150" Height="30"/>
    <TextBlock Text="{Binding UserName}" Margin="0,40,0,0"/>
</Grid>
            
// MainWindow.xaml.cs (例: ViewModelと連携)
using System.ComponentModel; // INotifyPropertyChangedを使うために必要

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private string _userName;
    public string UserName
    {
        get { return _userName; }
        set
        {
            if (_userName != value)
            {
                _userName = value;
                OnPropertyChanged("UserName"); // プロパティが変更されたことをUIに通知
            }
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this; // このウィンドウ自身をデータコンテキストとして設定
        UserName = "ゲスト"; // 初期値
    }

    // INotifyPropertyChangedインターフェースの実装
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
            

Text="{Binding UserName, Mode=TwoWay}" のように記述するだけで、TextBoxの値とC#コードのUserNameプロパティが双方向に自動で同期されます。この機能は、複雑なUIを持つアプリケーション開発において非常に強力です。

5. 次のステップへ

WinFormsとWPFの基本的な違いと、簡単なアプリケーションの作成方法を学びました。どちらの技術も奥が深く、さらに学ぶべきことがたくさんあります。

デスクトップアプリ開発は、ユーザーに直接触れるインターフェースを作る楽しさがあります。ぜひ色々なアイデアを形にしてみてください。

参考資料

目次へ戻る