C#でポップアップを表示する方法|MessageBox・WPF・MAUIの実装サンプルを初心者向けに解説

はじめに

C#でアプリを作っていると、「処理が完了しました」「入力内容を確認してください」「本当に削除しますか?」のようなメッセージを画面に表示したい場面がよくあります。このような小さな通知画面や確認画面を、一般的にポップアップ、ダイアログ、アラートなどと呼びます。

C#でポップアップを表示する方法は、作っているアプリの種類によって変わります。Windows FormsやWPFのようなWindowsデスクトップアプリではMessageBoxがよく使われます。一方、.NET MAUIではDisplayAlertDisplayActionSheetを使って、Windows、Android、iOSなどの各プラットフォームに合ったポップアップを表示できます。

この記事では、C#初心者向けに、MessageBox、Windows Forms、WPF、.NET MAUIでポップアップを表示する方法を、実装サンプル付きでわかりやすく解説します。

1. C#でポップアップを表示する方法の全体像

1-1. C#のポップアップとは何か

C#におけるポップアップとは、ユーザーにメッセージを伝えたり、確認を求めたり、選択肢を表示したりするために、現在の画面の前面に表示される小さな画面のことです。

たとえば、次のような場面で使われます。

「保存が完了しました」と表示する
「名前を入力してください」と警告する
「削除してもよろしいですか?」と確認する
「画像を保存する」「共有する」「削除する」などの選択肢を表示する

Windows FormsやWPFでは、MessageBoxを使うと簡単にポップアップを表示できます。Microsoftのドキュメントでも、Windows FormsのMessageBoxは、ユーザーにメッセージを表示するモーダルウィンドウとして説明されています。モーダルウィンドウとは、ユーザーが閉じるまで元の画面操作を一時的に止める画面のことです。Microsoft Learn

1-2. ポップアップでできること

C#のポップアップでは、主に次のようなことができます。

単純なメッセージ表示
エラーや警告の通知
OK、キャンセル、はい、いいえなどのボタン表示
ユーザーが押したボタンの判定
複数の選択肢の表示
独自デザインの小さな画面表示

たとえば、ファイル削除処理の前に確認ポップアップを表示すれば、ユーザーの誤操作を防げます。また、入力チェックで未入力項目がある場合に警告ポップアップを表示すれば、何を修正すべきかをユーザーに伝えやすくなります。

1-3. C#で使える主なポップアップの種類

C#でよく使うポップアップには、次のような種類があります。

MessageBoxは、Windows FormsやWPFで使える標準的なメッセージ表示機能です。短い通知、確認、警告、エラー表示に向いています。

WPFのPopupコントロールは、ボタンやテキストボックスなどの近くに、独自のUIを浮かせて表示したいときに使います。WPFのPopupは、指定した要素や座標を基準にして配置を調整できます。Microsoft Learn

.NET MAUIのDisplayAlertDisplayAlertAsyncは、スマートフォンやデスクトップアプリでアラートを表示するときに使います。.NET MAUIでは、ポップアップが各プラットフォームのネイティブコントロールとして表示されます。Microsoft Learn

.NET MAUIのDisplayActionSheetDisplayActionSheetAsyncは、複数の選択肢をユーザーに選ばせたいときに使います。

1-4. 開発環境ごとの実装方法の違い

C#でポップアップを表示する方法は、アプリの種類によって異なります。

Windows Formsでは、System.Windows.Forms.MessageBox.Showを使います。Windowsデスクトップアプリで、最も手軽にポップアップを表示できる方法です。

WPFでは、System.Windows.MessageBox.Showを使います。Windows Formsと似ていますが、名前空間やボタン・アイコンの列挙型が異なります。

WPFで独自デザインのポップアップを作る場合は、Popupコントロールや独自のWindowを使います。

.NET MAUIでは、DisplayAlertDisplayAlertAsyncDisplayActionSheetDisplayActionSheetAsyncなどを使います。Windowsだけでなく、AndroidやiOSにも対応したポップアップを表示できます。

2. C#で最も簡単にポップアップを表示するMessageBox

2-1. MessageBoxとは

MessageBoxは、C#でポップアップを表示する代表的なクラスです。短いメッセージを表示したり、ユーザーにOKやキャンセルを選ばせたりできます。

Windows FormsのMessageBox.Showには、テキストだけを表示するもの、タイトルを指定するもの、ボタンやアイコンを指定するものなど、複数のオーバーロードが用意されています。Microsoftのドキュメントでも、テキスト、キャプション、ボタン、アイコンなどを指定できることが示されています。Microsoft Learn

Windows Formsで使う場合は、基本的に次の名前空間を使います。

C#
using System.Windows.Forms;

WPFで使う場合は、次の名前空間を使います。

C#
using System.Windows;

同じMessageBoxという名前でも、Windows FormsとWPFでは所属する名前空間が異なる点に注意しましょう。

2-2. MessageBox.Showで文字だけのポップアップを表示する

最も簡単なポップアップは、MessageBox.Showに表示したい文字列を渡すだけです。

Windows Formsの場合は次のように書きます。

C#
using System.Windows.Forms;

MessageBox.Show("処理が完了しました。");

このコードを実行すると、「処理が完了しました。」というメッセージとOKボタンを持つポップアップが表示されます。

WPFの場合も基本的な書き方は似ています。

C#
using System.Windows;

MessageBox.Show("処理が完了しました。");

初心者がC#でポップアップを試すなら、まずはこのMessageBox.Show("メッセージ")から覚えるとよいでしょう。

2-3. タイトル付きのポップアップを表示する

ポップアップには、本文だけでなくタイトルも表示できます。タイトルを付けると、何に関するメッセージなのかがわかりやすくなります。

C#
MessageBox.Show("データを保存しました。", "保存完了");

第1引数が本文、第2引数がタイトルです。

たとえば、入力エラーを表示するなら次のように書けます。

C#
MessageBox.Show("名前を入力してください。", "入力エラー");

タイトルには「確認」「エラー」「警告」「完了」など、メッセージの種類がわかる言葉を使うと親切です。

2-4. OK・キャンセルなどのボタンを表示する

MessageBoxでは、OKボタンだけでなく、OK・キャンセル、はい・いいえ、再試行・キャンセルなどのボタンを表示できます。

Windows Formsの場合は、MessageBoxButtonsを使います。

C#
DialogResult result = MessageBox.Show(
"処理を続行しますか?",
"確認",
MessageBoxButtons.OKCancel
);

よく使うボタンの種類は次のとおりです。

C#
MessageBoxButtons.OK
MessageBoxButtons.OKCancel
MessageBoxButtons.YesNo
MessageBoxButtons.YesNoCancel
MessageBoxButtons.RetryCancel

WPFの場合は、MessageBoxButtonを使います。

C#
MessageBoxResult result = MessageBox.Show(
"処理を続行しますか?",
"確認",
MessageBoxButton.OKCancel
);

Windows FormsではMessageBoxButtons、WPFではMessageBoxButtonという名前になるため、混同しないようにしましょう。

2-5. 情報・警告・エラーなどのアイコンを表示する

ポップアップには、情報、警告、エラー、質問などのアイコンを表示できます。アイコンを付けると、ユーザーがメッセージの重要度をすぐに判断しやすくなります。

Windows Formsでは、MessageBoxIconを指定します。

C#
MessageBox.Show(
"ファイルが見つかりませんでした。",
"エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);

よく使うアイコンは次のとおりです。

C#
MessageBoxIcon.Information
MessageBoxIcon.Warning
MessageBoxIcon.Error
MessageBoxIcon.Question

WPFでは、MessageBoxImageを使います。

C#
MessageBox.Show(
"ファイルが見つかりませんでした。",
"エラー",
MessageBoxButton.OK,
MessageBoxImage.Error
);

情報メッセージにはInformation、注意を促すメッセージにはWarning、処理失敗にはErrorを使うと自然です。

2-6. ユーザーが押したボタンを判定する

確認ポップアップでは、ユーザーがどのボタンを押したかによって処理を分けることが重要です。

Windows Formsでは、戻り値としてDialogResultを受け取ります。

C#
DialogResult result = MessageBox.Show(
"データを削除してもよろしいですか?",
"削除確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning
);

if (result == DialogResult.Yes)
{
// 削除処理
MessageBox.Show("削除しました。");
}
else
{
MessageBox.Show("削除をキャンセルしました。");
}

WPFでは、戻り値としてMessageBoxResultを受け取ります。WPFのMessageBox.Showでも、テキスト、タイトル、アイコン、ボタンを構成でき、結果を受け取れます。Microsoft Learn

C#
MessageBoxResult result = MessageBox.Show(
"データを削除してもよろしいですか?",
"削除確認",
MessageBoxButton.YesNo,
MessageBoxImage.Warning
);

if (result == MessageBoxResult.Yes)
{
MessageBox.Show("削除しました。");
}
else
{
MessageBox.Show("削除をキャンセルしました。");
}

3. Windows Formsでポップアップを表示する方法

3-1. Windows FormsアプリでMessageBoxを使う基本コード

Windows Formsでポップアップを表示するには、System.Windows.FormsMessageBoxを使います。

C#
using System;
using System.Windows.Forms;

namespace WinFormsPopupSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

MessageBox.Show("フォームを起動しました。");
}
}
}

この例では、フォームが作成されたタイミングでポップアップが表示されます。ただし、実際のアプリでは起動直後に毎回ポップアップを出すと邪魔になることがあります。そのため、ボタンクリック時やエラー発生時など、必要なタイミングで表示するのが一般的です。

3-2. ボタンクリック時にポップアップを表示する

Windows Formsでは、ボタンのクリックイベント内でMessageBox.Showを呼び出す使い方がよくあります。

C#
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("ボタンがクリックされました。", "通知");
}

Visual Studioでフォームにボタンを配置し、ボタンをダブルクリックすると、クリックイベントのコードが自動生成されます。その中にMessageBox.Showを書くことで、ボタンを押したときにポップアップを表示できます。

3-3. 入力チェックエラーをポップアップで通知する

テキストボックスが空のまま登録ボタンを押された場合、ポップアップで入力エラーを知らせることができます。

C#
private void registerButton_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(nameTextBox.Text))
{
MessageBox.Show(
"名前を入力してください。",
"入力エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);

nameTextBox.Focus();
return;
}

MessageBox.Show("登録しました。", "完了");
}

string.IsNullOrWhiteSpaceを使うと、空文字だけでなく、スペースだけの入力も未入力として判定できます。

入力エラーのポップアップでは、何が間違っているのか、どうすればよいのかを具体的に書くことが大切です。

悪い例は次のようなメッセージです。

C#
MessageBox.Show("エラーです。");

これでは、ユーザーは何を直せばよいかわかりません。

よい例は次のようなメッセージです。

C#
MessageBox.Show("名前を入力してください。", "入力エラー");

3-4. 確認ダイアログを表示して処理を分岐する

削除や上書き保存など、取り消しが難しい処理では、事前に確認ポップアップを表示すると安全です。

C#
private void deleteButton_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show(
"選択中のデータを削除します。よろしいですか?",
"削除確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question
);

if (result == DialogResult.Yes)
{
// 削除処理
MessageBox.Show("削除しました。", "完了");
}
else
{
MessageBox.Show("削除をキャンセルしました。", "キャンセル");
}
}

このように、MessageBox.Showの戻り値をDialogResultで受け取ることで、ユーザーの選択に応じて処理を分岐できます。

3-5. Windows Formsでよく使う実装パターン

Windows Formsでよく使うポップアップの実装パターンは、主に次の3つです。

1つ目は、処理完了の通知です。

C#
MessageBox.Show("保存しました。", "完了", MessageBoxButtons.OK, MessageBoxIcon.Information);

2つ目は、入力エラーの警告です。

C#
MessageBox.Show("必須項目が入力されていません。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);

3つ目は、削除や終了前の確認です。

C#
DialogResult result = MessageBox.Show(
"アプリケーションを終了しますか?",
"終了確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question
);

if (result == DialogResult.Yes)
{
Application.Exit();
}

Windows Formsでは、まずこの3パターンを覚えておけば、多くの場面でポップアップを実装できます。

4. WPFでポップアップを表示する方法

4-1. WPFアプリでMessageBoxを使う基本コード

WPFでポップアップを表示する場合も、MessageBox.Showを使えます。ただし、Windows Formsとは名前空間が異なり、WPFではSystem.Windows.MessageBoxを使います。

C#
using System.Windows;

namespace WpfPopupSample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

MessageBox.Show("WPFアプリを起動しました。");
}
}
}

WPFのMessageBoxは、手軽な通知や確認に向いています。単純なポップアップであれば、Windows Formsと同じ感覚で使えます。

4-2. XAMLのボタン操作からポップアップを表示する

WPFでは、画面レイアウトをXAMLで作成し、クリック時の処理をC#側に書きます。

まず、XAMLにボタンを配置します。

XML
<Window x:Class="WpfPopupSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WPF Popup Sample"
Height="200"
Width="400">
<Grid>
<Button Content="ポップアップ表示"
Width="150"
Height="40"
Click="ShowPopupButton_Click" />
</Grid>
</Window>

次に、C#側にクリックイベントを書きます。

C#
using System.Windows;

namespace WpfPopupSample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void ShowPopupButton_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(
"ボタンがクリックされました。",
"通知",
MessageBoxButton.OK,
MessageBoxImage.Information
);
}
}
}

このコードでは、WPFのボタンをクリックすると、情報アイコン付きのポップアップが表示されます。

4-3. WPFのPopupコントロールを使う方法

WPFには、MessageBoxとは別にPopupコントロールがあります。Popupは、画面上の特定の位置に小さなUIを浮かせて表示したいときに使います。

たとえば、ボタンの下に簡単な説明を表示する場合は、次のように書けます。

XML
<Window x:Class="WpfPopupSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework"
Title="Popup Sample"
Height="250"
Width="400">
<Grid>
<Button x:Name="InfoButton"
Content="説明を表示"
Width="120"
Height="40"
Click="InfoButton_Click" />

<Popup x:Name="InfoPopup"
PlacementTarget="{Binding ElementName=InfoButton}"
Placement="Bottom"
StaysOpen="False">
<Border Background="White"
BorderBrush="Gray"
BorderThickness="1"
Padding="10">
<TextBlock Text="ここに補足説明を表示します。" />
</Border>
</Popup>
</Grid>
</Window>

C#側では、IsOpentrueにして表示します。

C#
private void InfoButton_Click(object sender, RoutedEventArgs e)
{
InfoPopup.IsOpen = true;
}

Popupは、MessageBoxよりも自由にデザインできます。ボタンの近くに説明を表示したい場合、入力補助を表示したい場合、独自の小さなメニューを作りたい場合に便利です。

4-4. PopupとMessageBoxの違い

MessageBoxPopupは、どちらもポップアップのように表示できますが、役割が異なります。

MessageBoxは、メッセージ通知や確認ダイアログに向いています。ユーザーがOKやはい・いいえを押すまで処理を止めたい場合に便利です。

Popupは、画面上に一時的なUIを表示したい場合に向いています。補足説明、候補リスト、小さなメニュー、独自デザインの表示などに使えます。

たとえば、「削除してよいですか?」と確認するならMessageBoxが適しています。一方、「入力欄の下に候補を表示したい」という場合はPopupが適しています。

4-5. MVVMでポップアップを表示する際の注意点

WPFでMVVMを採用している場合、ViewModelから直接MessageBox.Showを呼び出す設計は避けたほうがよい場合があります。ViewModelが画面表示の具体的な仕組みに依存してしまうためです。

簡単なアプリなら次のようにViewModelから呼び出しても動作はします。

C#
MessageBox.Show("保存しました。");

しかし、保守性を考えるなら、ポップアップ表示用のサービスを作る方法があります。

C#
public interface IMessageService
{
void Show(string message, string title);
}

実装クラスでMessageBoxを呼び出します。

C#
using System.Windows;

public class MessageService : IMessageService
{
public void Show(string message, string title)
{
MessageBox.Show(message, title);
}
}

ViewModelではインターフェイスに依存します。

C#
public class MainViewModel
{
private readonly IMessageService _messageService;

public MainViewModel(IMessageService messageService)
{
_messageService = messageService;
}

public void Save()
{
// 保存処理
_messageService.Show("保存しました。", "完了");
}
}

このようにすると、ViewModelのテストがしやすくなり、UIの実装も差し替えやすくなります。

5. .NET MAUIでポップアップを表示する方法

5-1. .NET MAUIにおけるポップアップ表示の基本

.NET MAUIでは、Windows、Android、iOS、macOSなど、複数のプラットフォームに対応したアプリをC#で作れます。ポップアップ表示には、主にDisplayAlertDisplayAlertAsyncDisplayActionSheetDisplayActionSheetAsyncを使います。

Microsoftのドキュメントでは、.NET MAUIのポップアップとして、アラート、アクションシート、プロンプトが説明されています。また、これらは各プラットフォームのネイティブコントロールとして表示されます。Microsoft Learn

現在の.NET MAUIでは、DisplayAlertAsyncDisplayActionSheetAsyncの利用が推奨される場面があります。DisplayAlertDisplayActionSheetは既存コードでよく見かけますが、ドキュメント上ではDisplayAlertAsyncDisplayActionSheetAsyncの使用が案内されています。Microsoft Learn+1

この記事では、検索されやすい名称であるDisplayAlertも扱いながら、実装例では新しい書き方としてDisplayAlertAsyncも紹介します。

5-2. DisplayAlertでアラートを表示する

.NET MAUIでシンプルなアラートを表示するには、ページ内で次のように書きます。

C#
await DisplayAlertAsync("通知", "保存が完了しました。", "OK");

古いサンプルや既存のコードでは、次のようにDisplayAlertを使っている場合もあります。

C#
await DisplayAlert("通知", "保存が完了しました。", "OK");

どちらも基本的な考え方は同じです。第1引数にタイトル、第2引数にメッセージ、第3引数にボタンの文字列を指定します。

ボタンクリック時に表示する例は次のとおりです。

C#
private async void OnSaveButtonClicked(object sender, EventArgs e)
{
await DisplayAlertAsync("完了", "データを保存しました。", "OK");
}

.NET MAUIのポップアップは非同期処理として扱うため、awaitを付けるのが基本です。

5-3. 確認ダイアログの結果を取得する

ユーザーに「はい」「いいえ」を選ばせたい場合は、2つのボタンを指定します。結果はboolで受け取れます。

C#
private async void OnDeleteButtonClicked(object sender, EventArgs e)
{
bool answer = await DisplayAlertAsync(
"削除確認",
"このデータを削除してもよろしいですか?",
"はい",
"いいえ"
);

if (answer)
{
await DisplayAlertAsync("完了", "削除しました。", "OK");
}
else
{
await DisplayAlertAsync("キャンセル", "削除をキャンセルしました。", "OK");
}
}

DisplayAlertAsyncで2つのボタンを表示した場合、肯定側のボタンが押されるとtrue、キャンセル側のボタンが押されるとfalseが返ります。Microsoftのドキュメントでも、2つのボタンを指定するとユーザーの応答をboolで取得できることが説明されています。Microsoft Learn

5-4. DisplayActionSheetで選択肢付きポップアップを表示する

複数の選択肢から選ばせたい場合は、DisplayActionSheetAsyncを使います。

C#
private async void OnMenuButtonClicked(object sender, EventArgs e)
{
string action = await DisplayActionSheetAsync(
"操作を選択してください",
"キャンセル",
null,
"編集",
"コピー",
"削除"
);

await DisplayAlertAsync("選択結果", $"{action} が選択されました。", "OK");
}

DisplayActionSheetAsyncは、ユーザーが選んだボタンの文字列を返します。アクションシートは、複数の操作候補を表示して、その中から1つを選ばせたい場合に便利です。Microsoft Learn

削除のような危険な操作を含める場合は、破壊的操作として指定できます。

C#
string action = await DisplayActionSheetAsync(
"画像の操作",
"キャンセル",
"削除",
"保存",
"共有"
);

この場合、"削除"が破壊的操作として扱われます。iOSでは、破壊的操作のボタンが他のボタンと異なる表示になることがあります。Microsoft Learn

5-5. Windows・Android・iOSでの表示の違い

.NET MAUIのポップアップは、各プラットフォームのネイティブUIとして表示されます。そのため、同じC#コードを書いても、Windows、Android、iOSで見た目や閉じ方が少し異なります。

たとえば、Androidではアラートの外側をタップして閉じられる場合があります。デスクトップ環境では、Escキーで閉じられる場合があります。Microsoftのドキュメントでも、Androidやデスクトッププラットフォームでの閉じ方の違いが説明されています。Microsoft Learn

そのため、.NET MAUIでポップアップを作るときは、「すべてのOSでまったく同じ見た目になる」と考えるのではなく、「各OSに自然な見た目で表示される」と考えるとよいでしょう。

6. 用途別に使い分けるC#のポップアップ実装

6-1. メッセージ通知を表示したい場合

処理完了や保存完了など、単純な通知を表示したい場合は、OKボタンだけのポップアップで十分です。

Windows FormsやWPFでは、MessageBox.Showを使います。

C#
MessageBox.Show("保存が完了しました。", "完了");

.NET MAUIでは、DisplayAlertAsyncを使います。

C#
await DisplayAlertAsync("完了", "保存が完了しました。", "OK");

通知メッセージは短く、わかりやすく書くことが大切です。

6-2. エラーや警告を表示したい場合

エラーや警告を表示する場合は、アイコン付きのポップアップにすると、ユーザーに重要度が伝わりやすくなります。

Windows Formsの場合は次のように書きます。

C#
MessageBox.Show(
"ファイルの読み込みに失敗しました。",
"エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);

WPFの場合は次のように書きます。

C#
MessageBox.Show(
"ファイルの読み込みに失敗しました。",
"エラー",
MessageBoxButton.OK,
MessageBoxImage.Error
);

入力ミスや注意喚起には、Warningを使うとよいでしょう。

C#
MessageBox.Show(
"必須項目を入力してください。",
"警告",
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);

6-3. ユーザーに確認を求めたい場合

削除、上書き、終了など、ユーザーの確認が必要な操作では、Yes・Noのポップアップを使います。

C#
DialogResult result = MessageBox.Show(
"変更内容を破棄して終了しますか?",
"確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question
);

if (result == DialogResult.Yes)
{
Close();
}

.NET MAUIの場合は、boolで結果を受け取ります。

C#
bool answer = await DisplayAlertAsync(
"確認",
"変更内容を破棄して終了しますか?",
"はい",
"いいえ"
);

if (answer)
{
await Navigation.PopAsync();
}

6-4. 複数の選択肢から選ばせたい場合

複数の操作を選ばせたい場合、Windows FormsやWPFでは独自フォームや独自ウィンドウを作る方法があります。単純な確認だけならMessageBoxで足りますが、3つ以上の独自選択肢を自然に見せたい場合は、専用画面を作ったほうが扱いやすいことがあります。

.NET MAUIでは、DisplayActionSheetAsyncが便利です。

C#
string selected = await DisplayActionSheetAsync(
"共有方法を選択してください",
"キャンセル",
null,
"メール",
"コピー",
"SNS"
);

if (selected == "メール")
{
// メール処理
}
else if (selected == "コピー")
{
// コピー処理
}
else if (selected == "SNS")
{
// SNS共有処理
}

6-5. 独自デザインのポップアップを作りたい場合

標準のMessageBoxでは、見た目を細かく変更することはできません。ボタン配置や背景色、入力欄、画像などを自由に作りたい場合は、独自デザインのポップアップを作ります。

Windows Formsでは、新しいFormを作成してダイアログとして表示できます。

C#
using (var form = new CustomDialogForm())
{
DialogResult result = form.ShowDialog();

if (result == DialogResult.OK)
{
// OK時の処理
}
}

WPFでは、独自のWindowPopupコントロールを使えます。

C#
var dialog = new CustomDialogWindow();
bool? result = dialog.ShowDialog();

if (result == true)
{
// OK時の処理
}

.NET MAUIでは、標準のアラートだけでなく、CommunityToolkit.Mauiなどを使って独自のポップアップを作る方法もあります。標準UIで足りるならDisplayAlertAsync、デザインや入力項目が必要なら独自ポップアップ、というように使い分けるとよいでしょう。

7. C#のポップアップ実装サンプル集

7-1. OKボタンだけのシンプルなポップアップ

Windows FormsまたはWPFで、OKボタンだけのシンプルなポップアップを表示する例です。

C#
MessageBox.Show("処理が完了しました。");

タイトルを付ける場合は次のように書きます。

C#
MessageBox.Show("処理が完了しました。", "完了");

.NET MAUIの場合は次のとおりです。

C#
await DisplayAlertAsync("完了", "処理が完了しました。", "OK");

7-2. Yes・Noで処理を分岐する確認ポップアップ

Windows Formsの例です。

C#
DialogResult result = MessageBox.Show(
"このファイルを削除しますか?",
"確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question
);

if (result == DialogResult.Yes)
{
MessageBox.Show("削除しました。");
}
else
{
MessageBox.Show("削除を中止しました。");
}

WPFの例です。

C#
MessageBoxResult result = MessageBox.Show(
"このファイルを削除しますか?",
"確認",
MessageBoxButton.YesNo,
MessageBoxImage.Question
);

if (result == MessageBoxResult.Yes)
{
MessageBox.Show("削除しました。");
}
else
{
MessageBox.Show("削除を中止しました。");
}

.NET MAUIの例です。

C#
bool result = await DisplayAlertAsync(
"確認",
"このファイルを削除しますか?",
"はい",
"いいえ"
);

if (result)
{
await DisplayAlertAsync("完了", "削除しました。", "OK");
}
else
{
await DisplayAlertAsync("中止", "削除を中止しました。", "OK");
}

7-3. 入力内容が空の場合に警告を出すポップアップ

Windows Formsの例です。

C#
private void saveButton_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(nameTextBox.Text))
{
MessageBox.Show(
"名前を入力してください。",
"入力エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);

nameTextBox.Focus();
return;
}

MessageBox.Show("保存しました。", "完了");
}

WPFの例です。

C#
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(NameTextBox.Text))
{
MessageBox.Show(
"名前を入力してください。",
"入力エラー",
MessageBoxButton.OK,
MessageBoxImage.Warning
);

NameTextBox.Focus();
return;
}

MessageBox.Show("保存しました。", "完了");
}

.NET MAUIの例です。

C#
private async void OnSaveButtonClicked(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(NameEntry.Text))
{
await DisplayAlertAsync("入力エラー", "名前を入力してください。", "OK");
NameEntry.Focus();
return;
}

await DisplayAlertAsync("完了", "保存しました。", "OK");
}

7-4. 例外発生時にエラーメッセージを表示するポップアップ

ファイル読み込みやデータベース処理などでは、例外が発生する可能性があります。例外を捕まえて、ユーザー向けのエラーメッセージを表示しましょう。

C#
try
{
string text = File.ReadAllText("sample.txt");
MessageBox.Show("ファイルを読み込みました。", "完了");
}
catch (FileNotFoundException)
{
MessageBox.Show(
"指定されたファイルが見つかりませんでした。",
"ファイルエラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
catch (Exception ex)
{
MessageBox.Show(
$"予期しないエラーが発生しました。\n{ex.Message}",
"エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}

開発中はex.Messageを表示すると原因を把握しやすいですが、本番アプリでは内部情報を出しすぎないように注意が必要です。

.NET MAUIの場合は次のように書けます。

C#
try
{
string text = File.ReadAllText("sample.txt");
await DisplayAlertAsync("完了", "ファイルを読み込みました。", "OK");
}
catch (FileNotFoundException)
{
await DisplayAlertAsync("ファイルエラー", "指定されたファイルが見つかりませんでした。", "OK");
}
catch (Exception)
{
await DisplayAlertAsync("エラー", "予期しないエラーが発生しました。", "OK");
}

7-5. 非同期処理後に完了メッセージを表示するポップアップ

非同期処理が完了したあとにポップアップを表示する例です。たとえば、保存処理やAPI通信後に完了通知を出したい場合に使えます。

WPFの例です。

C#
private async void SaveButton_Click(object sender, RoutedEventArgs e)
{
await SaveDataAsync();

MessageBox.Show(
"データの保存が完了しました。",
"完了",
MessageBoxButton.OK,
MessageBoxImage.Information
);
}

private async Task SaveDataAsync()
{
await Task.Delay(1000);

// 実際の保存処理を書く
}

.NET MAUIの例です。

C#
private async void OnSaveButtonClicked(object sender, EventArgs e)
{
await SaveDataAsync();

await DisplayAlertAsync(
"完了",
"データの保存が完了しました。",
"OK"
);
}

private async Task SaveDataAsync()
{
await Task.Delay(1000);

// 実際の保存処理を書く
}

非同期処理では、ポップアップ表示にもawaitを付けることで、処理の順番がわかりやすくなります。

8. C#でポップアップを実装するときの注意点

8-1. ポップアップを出しすぎない

ポップアップは便利ですが、出しすぎるとユーザーにとってストレスになります。

たとえば、入力欄を1つ移動するたびにポップアップが出たり、軽微な通知のたびにOKを押させたりすると、操作性が悪くなります。

ポップアップを使うべき場面は、主に次のような場合です。

ユーザーに必ず読んでほしい重要なメッセージ
処理を続行する前に確認が必要な場面
エラーにより処理を進められない場面
削除や上書きなど、取り消しが難しい操作の前

反対に、保存完了などの軽い通知は、ステータスバー、トースト通知、画面内メッセージで済ませたほうがよい場合もあります。

8-2. UIスレッド以外から表示するときの注意点

Windows FormsやWPFでは、画面操作は基本的にUIスレッドで行う必要があります。バックグラウンドスレッドから直接MessageBoxを表示したり、画面部品を操作したりすると、エラーや予期しない動作の原因になります。

WPFでUIスレッドに戻してポップアップを表示する例です。

C#
Application.Current.Dispatcher.Invoke(() =>
{
MessageBox.Show("処理が完了しました。", "完了");
});

Windows Formsでは、フォームのInvokeを使う方法があります。

C#
this.Invoke(() =>
{
MessageBox.Show("処理が完了しました。", "完了");
});

.NET MAUIでは、UI操作が必要な場合にメインスレッドで実行することを意識します。

C#
await MainThread.InvokeOnMainThreadAsync(async () =>
{
await DisplayAlertAsync("完了", "処理が完了しました。", "OK");
});

通常のボタンクリックイベント内であればUIスレッド上で動作するため、過度に心配する必要はありません。ただし、Task.Runなどを使ってバックグラウンド処理を行う場合は注意しましょう。

8-3. 例外処理と組み合わせるときの注意点

例外が発生したときにポップアップを表示するのはよくある実装です。ただし、例外メッセージをそのままユーザーに見せると、専門的すぎて理解しづらいことがあります。

たとえば、次のような表示は開発者には便利ですが、ユーザーにはわかりにくい場合があります。

C#
MessageBox.Show(ex.ToString());

ユーザー向けには、次のように簡潔なメッセージにするのがおすすめです。

C#
MessageBox.Show(
"データの保存中にエラーが発生しました。時間をおいて再度お試しください。",
"保存エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);

一方で、開発者向けにはログファイルに詳細を残すと、原因調査がしやすくなります。

C#
try
{
SaveData();
}
catch (Exception ex)
{
File.WriteAllText("error.log", ex.ToString());

MessageBox.Show(
"保存中にエラーが発生しました。",
"エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}

8-4. ユーザーに伝わりやすいメッセージ文の書き方

ポップアップのメッセージは、短く具体的に書くことが重要です。

悪い例です。

C#
MessageBox.Show("エラーが発生しました。");

これだけでは、何が起きたのか、ユーザーが何をすればよいのかわかりません。

よい例です。

C#
MessageBox.Show(
"メールアドレスが入力されていません。メールアドレスを入力してください。",
"入力エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);

よいメッセージにするポイントは、次の3つです。

何が起きたのかを書く
ユーザーが何をすればよいのかを書く
専門用語をできるだけ避ける

たとえば、「NullReferenceExceptionが発生しました」と表示するよりも、「必要なデータを取得できませんでした。画面を開き直してください。」と表示したほうが、ユーザーには伝わりやすくなります。

8-5. アプリの種類に合った方法を選ぶ

C#のポップアップ実装では、アプリの種類に合った方法を選ぶことが大切です。

Windows Formsなら、まずMessageBox.Showを使うのが簡単です。

WPFなら、単純な通知や確認にはMessageBox.Show、独自UIにはPopupや独自Windowを使います。

.NET MAUIなら、単純なアラートにはDisplayAlertAsync、選択肢にはDisplayActionSheetAsyncを使います。

Webアプリの場合は、C#側だけでなく、JavaScriptのalert、モーダルダイアログ、Blazorのコンポーネントなどを検討する必要があります。

9. C#のポップアップでよくあるエラーと対処法

9-1. MessageBoxが認識されない場合

MessageBoxが認識されない場合、名前空間が不足している可能性があります。

Windows Formsの場合は、次を追加します。

C#
using System.Windows.Forms;

WPFの場合は、次を追加します。

C#
using System.Windows;

ただし、Windows FormsとWPFの両方の名前空間を同時に使っていると、どちらのMessageBoxか曖昧になる場合があります。その場合は、完全修飾名で書くと解決できます。

Windows FormsのMessageBoxを明示する例です。

C#
System.Windows.Forms.MessageBox.Show("こんにちは");

WPFのMessageBoxを明示する例です。

C#
System.Windows.MessageBox.Show("こんにちは");

また、コンソールアプリでMessageBoxを使いたい場合は、Windows FormsやWPFの参照設定が必要になることがあります。単純なコンソールアプリでは、基本的にConsole.WriteLineを使うほうが自然です。

9-2. WPFでPopupが表示されない場合

WPFのPopupが表示されない場合、まずIsOpentrueになっているか確認しましょう。

C#
MyPopup.IsOpen = true;

次に、PlacementTargetPlacementが正しく設定されているか確認します。

XML
<Popup x:Name="MyPopup"
PlacementTarget="{Binding ElementName=ShowButton}"
Placement="Bottom">
<Border Background="White" Padding="10">
<TextBlock Text="ポップアップです。" />
</Border>
</Popup>

また、Popupの中身に背景やサイズがないと、表示されていても見えにくい場合があります。BorderTextBlockを入れて、背景色、余白、枠線を設定すると確認しやすくなります。

XML
<Border Background="White"
BorderBrush="Gray"
BorderThickness="1"
Padding="10">
<TextBlock Text="表示内容" />
</Border>

StaysOpen="False"を指定している場合、外側をクリックするとすぐ閉じることがあります。表示テスト中はStaysOpen="True"にして確認するのも有効です。

9-3. MAUIでDisplayAlertが使えない場合

.NET MAUIでDisplayAlertDisplayAlertAsyncが使えない場合、呼び出している場所を確認しましょう。DisplayAlertDisplayAlertAsyncは、通常ContentPageなどのPage上で呼び出します。

たとえば、ページのコードビハインドでは次のように使えます。

C#
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}

private async void OnButtonClicked(object sender, EventArgs e)
{
await DisplayAlertAsync("通知", "ボタンが押されました。", "OK");
}
}

ViewModelなど、Pageではないクラスから直接呼び出そうとすると使えない場合があります。その場合は、ページ側で表示する、メッセージ表示サービスを作る、Application.Current.MainPage経由で呼び出すなどの方法を検討します。

C#
await Application.Current.MainPage.DisplayAlertAsync(
"通知",
"メッセージを表示します。",
"OK"
);

ただし、アプリ構成によってはApplication.Current.MainPageが期待通りでない場合もあるため、設計としてはメッセージ表示サービスを用意する方法が扱いやすいです。

9-4. ボタンの戻り値を取得できない場合

MessageBoxDisplayAlertでユーザーの選択を取得したい場合は、戻り値を変数に代入する必要があります。

戻り値を取得していない例です。

C#
MessageBox.Show("削除しますか?", "確認", MessageBoxButtons.YesNo);

このコードでは、ユーザーがどちらを押したかを後続処理で使えません。

戻り値を取得する例です。

C#
DialogResult result = MessageBox.Show(
"削除しますか?",
"確認",
MessageBoxButtons.YesNo
);

if (result == DialogResult.Yes)
{
// 削除処理
}

WPFの場合は、MessageBoxResultを使います。

C#
MessageBoxResult result = MessageBox.Show(
"削除しますか?",
"確認",
MessageBoxButton.YesNo
);

if (result == MessageBoxResult.Yes)
{
// 削除処理
}

.NET MAUIの場合は、awaitを忘れないようにします。

C#
bool result = await DisplayAlertAsync(
"確認",
"削除しますか?",
"はい",
"いいえ"
);

if (result)
{
// 削除処理
}

9-5. 非同期処理でポップアップが期待通り表示されない場合

非同期処理でポップアップが表示されない、順番がおかしい、処理が先に進んでしまうという場合は、awaitが不足している可能性があります。

よくない例です。

C#
DisplayAlertAsync("完了", "保存しました。", "OK");
LoadNextPage();

この場合、ポップアップの完了を待たずに次の処理へ進んでしまう可能性があります。

よい例です。

C#
await DisplayAlertAsync("完了", "保存しました。", "OK");
LoadNextPage();

また、イベントハンドラーではasync voidを使うことがありますが、通常のメソッドではasync Taskにするのが基本です。

C#
private async Task SaveAsync()
{
await SaveDataAsync();
await DisplayAlertAsync("完了", "保存しました。", "OK");
}

WPFでも、非同期処理後にMessageBoxを表示する場合は、UIスレッドで実行されているかに注意しましょう。

C#
await Task.Run(() =>
{
// 重い処理
});

MessageBox.Show("処理が完了しました。");

await後にUIスレッドへ戻る通常のケースでは問題ありませんが、明示的に別スレッドを使っている場合は、Dispatcherを使ってUIスレッドで表示することを検討します。

10. C#のポップアップに関するよくある質問

10-1. C#で一番簡単にポップアップを出す方法は何か

Windows FormsやWPFで一番簡単にポップアップを出す方法は、MessageBox.Showを使うことです。

C#
MessageBox.Show("こんにちは");

タイトルを付ける場合は次のようにします。

C#
MessageBox.Show("こんにちは", "メッセージ");

.NET MAUIでは、DisplayAlertAsyncを使うのが簡単です。

C#
await DisplayAlertAsync("メッセージ", "こんにちは", "OK");

初心者の場合は、まずこの3つを覚えるとよいでしょう。

10-2. MessageBoxはWindows以外でも使えるか

Windows FormsやWPFのMessageBoxは、基本的にWindowsデスクトップアプリ向けの機能です。AndroidやiOS向けの.NET MAUIアプリで、Windows FormsやWPFのMessageBoxをそのまま使うことはできません。

クロスプラットフォームアプリでポップアップを表示したい場合は、.NET MAUIのDisplayAlertAsyncDisplayActionSheetAsyncを使います。

C#
await DisplayAlertAsync("通知", "メッセージを表示します。", "OK");

Windows専用アプリならMessageBox、複数プラットフォーム対応アプリなら.NET MAUIのポップアップ機能、というように使い分けましょう。

10-3. WPFで独自デザインのポップアップは作れるか

WPFでは、独自デザインのポップアップを作れます。簡単な浮かせ表示ならPopupコントロール、しっかりしたダイアログ画面なら独自のWindowを使う方法があります。

Popupを使う例です。

XML
<Popup x:Name="CustomPopup" Placement="Center">
<Border Background="White"
BorderBrush="Black"
BorderThickness="1"
Padding="20">
<StackPanel>
<TextBlock Text="独自デザインのポップアップです。" />
<Button Content="閉じる" Click="ClosePopup_Click" />
</StackPanel>
</Border>
</Popup>

C#側です。

C#
private void ShowPopup_Click(object sender, RoutedEventArgs e)
{
CustomPopup.IsOpen = true;
}

private void ClosePopup_Click(object sender, RoutedEventArgs e)
{
CustomPopup.IsOpen = false;
}

標準のMessageBoxではデザイン変更に限界があるため、見た目を作り込みたい場合はPopupや独自Windowを使いましょう。

10-4. MAUIでスマホ向けのポップアップは作れるか

.NET MAUIでは、スマホ向けのポップアップを作れます。DisplayAlertAsyncを使えば、AndroidやiOSのネイティブな見た目に合ったアラートを表示できます。

C#
await DisplayAlertAsync("通知", "スマホ向けのアラートです。", "OK");

複数の選択肢を表示する場合は、DisplayActionSheetAsyncを使います。

C#
string action = await DisplayActionSheetAsync(
"操作を選択",
"キャンセル",
null,
"写真を撮る",
"ライブラリから選ぶ"
);

.NET MAUIでは、同じC#コードでもプラットフォームごとに自然な見た目で表示されるため、スマホアプリでも使いやすいポップアップを実装できます。

10-5. ポップアップではなくトースト通知を使うべきケースはあるか

ポップアップは、ユーザーの操作を一時的に止めてメッセージを確認させるUIです。そのため、重要な確認やエラー表示には向いています。

一方で、軽い通知にはトースト通知や画面内メッセージのほうが向いている場合があります。

たとえば、次のような内容はポップアップよりもトースト通知が適していることがあります。

保存しました
コピーしました
同期が完了しました
メッセージを送信しました

反対に、次のような内容はポップアップが適しています。

削除してもよろしいですか?
入力内容に誤りがあります
ファイルの読み込みに失敗しました
この操作は元に戻せません

ユーザーに操作を止めて確認してほしい場合はポップアップ、軽く知らせるだけならトースト通知、という基準で使い分けるとよいでしょう。

まとめ

C#でポップアップを表示する方法は、アプリの種類によって異なります。Windows FormsやWPFでは、MessageBox.Showを使うと簡単にメッセージ、確認、警告、エラーを表示できます。Windows FormsではSystem.Windows.Forms.MessageBox、WPFではSystem.Windows.MessageBoxを使う点に注意しましょう。

WPFで独自デザインのポップアップを作りたい場合は、Popupコントロールや独自のWindowを使う方法があります。標準のMessageBoxよりも自由に見た目を作れるため、補足説明、候補表示、独自メニューなどに向いています。

.NET MAUIでは、DisplayAlertDisplayAlertAsyncDisplayActionSheetDisplayActionSheetAsyncを使って、Windows、Android、iOSなどに対応したポップアップを表示できます。特に現在の.NET MAUIでは、非同期メソッドであるDisplayAlertAsyncDisplayActionSheetAsyncを使う書き方を覚えておくとよいでしょう。

C#のポップアップ実装では、単に表示するだけでなく、ユーザーが押したボタンを判定すること、メッセージをわかりやすく書くこと、ポップアップを出しすぎないことが大切です。通知、警告、確認、選択肢、独自デザインという用途に応じて、適切な方法を選びましょう。