これまでの学習でC#の基本的なプログラミングスキルが身につきましたね。ここからは、皆さんが普段使っているような、ボタンやテキストボックスなどのグラフィカルな画面(GUI)を持つWindowsデスクトップアプリケーションの作成方法について学びましょう。C#では主にWindows Forms (WinForms) とWindows Presentation Foundation (WPF) という2つの技術が使われます。
Windowsデスクトップアプリは、Windowsオペレーティングシステム上で直接動作するアプリケーションのことです。Webブラウザやインターネット接続がなくても利用でき、OSの機能やローカルのファイルシステムに直接アクセスできるのが特徴です。
C#でデスクトップアプリを開発する主要なフレームワークとして、WinFormsとWPFがあります。それぞれの特徴を理解し、適切な方を選びましょう。
WinFormsは、最も古くからあるWindowsデスクトップアプリ開発のフレームワークです。Visual Studioのデザイナーでドラッグ&ドロップにより直感的にGUIを構築でき、学習コストが低いのが特徴です。
WPFは、WinFormsの後継として開発された、よりリッチで表現力豊かなUIを作成するためのフレームワークです。XAML(ザムル)というXMLベースの言語でUIを記述するのが特徴です。
どちらを選ぶべきか?
ここでは、WinFormsを使って簡単なGUIアプリを作成する手順を見ていきましょう。
MyWinFormsApp
)と場所を指定し、「作成」をクリックします。プロジェクトが作成されると、Visual Studioにデザイナ画面が表示され、フォーム(ウィンドウ)が1つ表示されます。
簡単なメッセージ表示アプリを作成してみましょう。
TextBox
: ユーザーが文字を入力する部分Button
: クリックできるボタンLabel
: テキストを表示する部分TextBox1
のName
をtextBoxName
に、Text
を空に。Button1
のName
をbuttonGreet
に、Text
を「挨拶」
に。Label1
のName
をlabelMessage
に、Text
を空に。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にテキストを設定
}
}
}
Visual Studioのツールバーにある「デバッグ開始」(緑色の再生ボタン)をクリックするか、F5
キーを押すと、作成したアプリが実行されます。テキストボックスに名前を入力し、ボタンをクリックして動作を確認しましょう。
WPFでは、UIの記述にXAMLを使います。WinFormsとは異なる考え方でUIを構築します。
MyWPFApp
)と場所を指定し、「作成」をクリックします。プロジェクトが作成されると、MainWindow.xaml
とそのコードビハインドファイルMainWindow.xaml.cs
が生成されます。.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>
<Window>
: アプリケーションのメインウィンドウを表します。<Grid>
: レイアウトコントロールの一つで、行と列を定義してコントロールを配置できます。x:Name="textBoxName"
: コードビハインドからコントロールを参照するための名前です。WinFormsのName
プロパティに相当します。Content="..."
: ボタンやラベルに表示するテキストを設定します。Click="Button_Click"
: ボタンがクリックされたときに実行するイベントハンドラを、コードビハインドで定義するメソッド名に指定します。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
プロパティでテキストを設定することが多いです(コントロールの種類によって異なります)。
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を持つアプリケーション開発において非常に強力です。
WinFormsとWPFの基本的な違いと、簡単なアプリケーションの作成方法を学びました。どちらの技術も奥が深く、さらに学ぶべきことがたくさんあります。
デスクトップアプリ開発は、ユーザーに直接触れるインターフェースを作る楽しさがあります。ぜひ色々なアイデアを形にしてみてください。