5.2 はじめてのWPFアプリ

(1/1)
はじめてのWPFアプリを動かした陽奈
AI生成コンテンツ / AI-generated content
5.1 Visual Studioの準備」では、Visual Studio 2026 Communityを導入し、中身の無い灰色のウィンドウが表示されるところまで確認した。本項では、ウィンドウにボタン文字を置き、ボタンを押すと現在時刻が表示されるアプリを作る。作るものは小さいが、ここで扱う内容は第5章の全体を通して使い続けることになる。
はじめに、Windowsアプリの作り方にはWindows FormsWPFWinUI 3の3通りがあることを比較表で示し、本講座がWPFを採用する理由を述べる。続いて、Visual Studioの画面は開かずに開発を進めるという本講座の方針を説明する。コードを書くのも、ビルドするのも、実行するのもCodexである。人間が行うのは、日本語で依頼することと、出来上がったアプリを動かして確かめることだけである。Codexが出力したコードは全文を掲載するが、利用者がコードを書く必要はない。書かれていることの意味が分かり、思ったとおりに動かないときにCodexへ伝えられるようになれば十分である。

目次

Windowsアプリの作り方は3通りある

Windowsのデスクトップアプリを作る道具は1つではない。マイクロソフトは20年以上にわたって複数の方式を提供してきており、現在も新規開発に使えるものが3つある。どれを選んでも、ウィンドウを表示し、ボタンを置き、ファイルを読み書きするアプリは作れる。違いは、画面をどう組み立てるかと、見た目をどこまで変えられるかである。順に見ていく。

Windows Forms(ウィンドウズ・フォーム、略してWinForms)は、2002年の.NET Framework 1.0とともに登場した、最も古い方式である。画面の上へ部品をマウスで並べ、位置と大きさを決めていく作り方で、覚えることが少ない。長く使われてきたため業務用アプリの資産が多く、.NET 10でも引き続き改良が続いている(WinForms for .NET 10 の新機能)。半面、部品の見た目はWindowsの標準品に近いものへ固定されやすく、画面の拡大縮小や高解像度ディスプレイへの対応で手間がかかる場面がある。

WPF(Windows Presentation Foundation)は、2006年の.NET Framework 3.0で登場した。最大の特徴は、画面をXAML(ザムル)という文字で記述する点である。文字で書くため、部品の色、余白、角の丸み、文字の大きさまで細かく指定でき、そしてその文字はCodexが書ける。.NET 10では、Windows 11風の見た目を与えるFluentテーマの対応コントロールが増え、描画やXAMLの解析が高速化された(.NET 10 の WPF の新機能)。

WinUI 3は、Windows 11の外観に合わせた最も新しい方式である。.NET本体とは別に配布されるWindows App SDKという部品群として提供され、2026年4月にバージョン2.0の安定版が公開された(Windows App SDK 2.0 release notes)。画面の記述にはWPFと同じくXAMLを使う。最新のデザインをそのまま使える半面、追加の部品を組み合わせる必要があり、解説記事や事例の数も、他の2つに比べるとまだ少ない。
Windowsアプリを作る3つの方式
項目Windows FormsWPFWinUI 3
登場時期2002年2006年2021年
画面の作り方部品を並べる(デザイナー前提)XAML(文字)で記述するXAML(文字)で記述する
見た目の自由度低い(標準の部品に近い外観)高い(色・余白・書体を細かく指定)高い(Windows 11の最新デザイン)
提供のしかた.NETに同梱.NETに同梱Windows App SDK(別途追加)
動作するWindowsWindows 10以降Windows 10以降Windows 10 バージョン1809以降
解説記事・事例の量多い(古い情報も多い)非常に多い少ない
.NET 10でのサポートありありあり(SDKの版に依存)
本講座での採用採用しない採用する採用しない
部品を並べて画面を作る方式と、文字で記述して画面を作る方式の違い
部品を並べる方式と、文字で記述する方式の違い
なお、WindowsだけでなくmacOSやスマートフォンでも動くアプリを作りたい場合は、.NET MAUIという別の選択肢がある。ただし、Windowsに用意された機能を細かく扱うには制約があり、本講座の目的(Windowsで常駐し、ファイルを自由に扱うツールを作る)には合わない。第5章では扱わない。

本講座がWPFを採用する理由

3つの方式に優劣はなく、何を重視するかで選ぶものである。本講座は次の4つの理由からWPFを採用する。
  1. .NET 10で正式にサポートされ、動作が安定している。.NET 10は2028年11月までサポートされる長期サポート版であり、WPFはその本体に同梱されている。追加の部品を入れる必要が無く、バージョンの組み合わせで悩むことがない。
  2. 解説記事と事例が多く、Codexが正しいコードを出しやすい。AIの回答の精度は、学習した情報の量と質に左右される。WPFには20年近い蓄積があり、質問に対して素直に動くコードが返ってくる。情報の少ない方式では、古い書き方や実在しない部品名が混ざった回答が出やすく、初心者には誤りの判別が難しい。
  3. XAMLで画面を記述するため、見た目の自由度が高い。文字の大きさ、色、余白、部品の並べ方を、すべてXAMLの記述で変えられる。「文字をもう少し大きく」「ボタンを右下に」といった要望を、Codexへ日本語で伝えるだけで反映できる。
  4. コマンドだけで最後まで完結する。プロジェクトの作成からビルド、実行、配布用の実行ファイルの発行まで、すべて dotnet というコマンドで行える。マウスで画面を操作する工程が無いということは、その工程をCodexに任せられるという意味である。これが本講座の進め方の土台になる。
誤解を避けるために書き添えておく。WPFは古くて捨てられた技術ではない。.NET 10でも新しいAPIが追加され、性能改善が続いている。一方で、Windows 11の最新の外観をそのまま使いたい、という目的であればWinUI 3が向く。既に動いているWindows Formsのアプリを直すのであれば、無理にWPFへ作り替える必要はない。目的に応じて選べばよい

Visual Studioの画面は開かない

ここで、本講座の進め方をはっきりさせておく。5.1でVisual Studioを導入したが、本項以降、Visual Studioの画面を開くことはない。それでは何のために入れたのか。.NET 10 SDK、C#のコンパイラー、WPFのビルドに必要な一式、そして作ったアプリを動かす.NET 10 デスクトップ ランタイムが、ワークロード「.NET デスクトップ開発」を選ぶだけでまとめて揃うからである。Visual Studioは、道具箱として入れておくものであり、作業の場ではない。
画面を開かないことには理由がある。統合開発環境の画面は、機能が多く、初心者が最初に覚えることが多すぎる。プロジェクトの設定画面、ソリューション エクスプローラー、デザイナー、プロパティ ウィンドウ、ビルド構成の切り替え。これらは、自分でコードを書く人には必要だが、Codexに書かせる人には要らない。マウスで画面を操作する工程を省くと、作業はすべて「日本語で依頼する」と「動いたものを確かめる」の2つに集約される。

実際の作業は、次の流れになる。第1章から第4章までの進め方と、ほとんど同じである。
  1. 作りたいものを日本語でCodexへ依頼する。「.NET 10、WPF、C#で作ってほしい」と技術を指定する。
  2. Codexがフォルダを作り、プロジェクトを作成し、XAMLとC#のファイルを書く。
  3. Codexが自分でビルドし、警告とエラーが無いことを確認する。エラーが出た場合は、Codexが自分でエラーを読み、直して、もう一度ビルドする。
  4. Codexがアプリを起動する。人間は表示されたウィンドウを操作して、思ったとおりに動くかを確かめる。
  5. 直したいところがあれば、日本語で追加の依頼をする。
人間はエラーメッセージを読まない。ここが第4章までと違う点である。ブラウザで動くプログラムでは、エラーが出たら開発者ツールを開いて内容をCodexへ貼り付けていた。第5章では、Codexが自分でコマンドを実行するので、エラーもCodexの手元に表示される。人間が伝えるのは、「ボタンを押しても何も起きない」「文字が小さすぎる」といった、見て分かることだけである。Codexが使うコマンドを下表に示す。自分で打つ必要はないが、Codexが何をしているかを読めるようにしておくと、途中で止まったときに状況が分かる。
Codexが使う主なdotnetコマンド
コマンド行われること
dotnet new wpf -n HelloWpfHelloWpfという名前のWPFプロジェクトを新しく作る
dotnet buildコードをWindowsが実行できる形に変換する。誤りがあればエラーとして表示される
dotnet runビルドしてから、アプリを起動する
dotnet cleanビルドで作られた途中の産物を片付ける。おかしな動作が続くときに使う
dotnet publish -c Release配布用の実行ファイル(EXE)を発行する。5.3で使う
dotnet --list-sdks入っているSDKの一覧を表示する。10.0で始まる行があればよい
Codexがdotnet buildを実行し、ビルドが成功した旨を表示しているターミナルの画面
ビルドもCodexが行う。人間はエラーメッセージを読まない
プロジェクト・フォルダの中身
名前種類役割
MainWindow.xamlXAML最初に開くウィンドウの見た目。ボタンや文字の配置を書く「画面の設計図」
MainWindow.xaml.csC#そのウィンドウの動き。ボタンが押されたときの処理などを書く
App.xamlXAMLアプリ全体の設定。最初に開くウィンドウの指定や、共通の色・書式
App.xaml.csC#アプリの起動時・終了時の処理
HelloWpf.csprojプロジェクト使用する.NETのバージョンや、外部部品の一覧。ビルドの設計図
bin フォルダ出力ビルドで作られた実行ファイルが置かれる。中は触らない
obj フォルダ作業用ビルドの途中で作られる作業ファイル。中は触らない

XAMLとC#の役割分担

WPFのアプリは、1つのウィンドウを2つのファイルで表す。
  1. MainWindow.xaml‥‥画面の設計図。どこに何を置くか、どんな見た目にするかを書く。
  2. MainWindow.xaml.cs‥‥動きの記述。ボタンが押されたら何をするかを書く。この対になるC#のファイルをコードビハインドと呼ぶ。
XAMLは、XMLの形式に従ったマークアップである。タグを入れ子にして画面を組み立てるので、HTMLを見たことがある人には見当がつきやすい。HTMLとの違いは、書いたタグがそのまま部品(オブジェクト)として組み立てられる点である(XAML 言語の概要)。
やりたいことは、XAMLとC#のどちらに書くか
やりたいこと書く場所理由
ウィンドウの題名と大きさを決めるXAML見た目に関わる指定である
ボタンや文字を画面に置くXAML部品の配置は設計図に書く
文字の大きさ、色、余白を決めるXAML同上
ボタンが押されたときに処理を行うC#動きの記述である
現在時刻を取り出すC#計算や取得はプログラムの仕事である
画面の文字を書き替えるC#XAMLで名前を付けた部品を指して代入する
1秒ごとに処理をくり返すC#時間の管理はプログラムの仕事である
XAMLとC#が1つのウィンドウを作る関係
設計図(XAML)と動き(C#)が組み合わさってウィンドウになる
2つに分ける利点は、直したい部分だけを触れることである。文字を大きくしたいだけならXAMLを、押したときの計算を変えたいだけならC#を直せばよい。Codexへの依頼も「XAMLのボタンの幅を広げてほしい」と部分を指定できるので、関係のない箇所が書き換わる事故が減る。
2つのファイルをつなぐのがx:Nameである。XAMLで部品に x:Name="TimeText" と名前を付けると、C#の側から TimeText という名前でその部品を扱えるようになる。名前を付けていない部品は、C#から指し示せない。よく使うXAMLの言葉を下表に示す。
入れ物にあたるStackPanelGridは、第5章で何度も出てくる。縦一列に並べるだけならStackPanel、表のように整えたいならGridと覚えておけばよい(パネル)。
XAMLでよく使う言葉
書き方読み役割
Windowウィンドウウィンドウ全体。題名や大きさをここで指定する
StackPanelスタックパネル中の部品を縦(または横)に順番に並べる入れ物
Gridグリッド行と列のマス目を作り、そこに部品を置く入れ物
TextBlockテキストブロック文字を表示する部品
Buttonボタン押すことができる部品
x:Nameエックス・ネーム部品に名前を付ける。C#から指し示すために必要である
Text、FontSize、Marginテキスト、フォントサイズ、マージン順に、表示する文字、文字の大きさ、周囲の余白
Clickクリック押されたときに呼び出すC#の処理の名前を書く

Codexへの依頼文の書き方

ここから実際に作る。題材は、ボタンを押すと現在時刻を表示するアプリである。第4章までと違い、第5章の依頼文には必ず書かなければならない項目がある。「WPF」「.NET 10」「C#」を書かずに「Windowsアプリを作って」と頼むと、Windows Formsのコードや、古い.NET Frameworkを前提としたコードが作られてしまう。作業の途中で前提が食い違うと、後の項で配布用の実行ファイルを作る段になって行き詰まる。
また、ビルドと実行までCodexに行わせると依頼文へ明記する。書かなければ、Codexはコードを表示するだけで作業を終えてしまうことがある。依頼文に書くべき項目を下表にまとめる。

以上をまとめた依頼文が次のものである。[コピー]ボタンでそのままCodexへ貼り付けられる。
第5章の依頼文に書く6項目
書くこと書き方の例省くと起きること
使う技術とバージョン.NET 10、WPF、C#で作ってほしいWindows Formsや古い.NETのコードが作られる
作業する場所HelloWpfというフォルダを作り、その中で作業してほしい関係のないファイルと混ざる
ビルドと実行の指示dotnet build でビルドし、警告とエラーが無いことを確認してから dotnet run で起動してほしいコードを表示するだけで終わる
画面の構成上に文字、その下に中央揃えのボタンを1つ置く想定と違う配置になる
動作ボタンを押すと、上の文字が現在の日時に変わる動作が曖昧なまま実装される
制約外部ライブラリは使わない。Visual Studioの画面は使わないNuGetの追加や、画面操作の手順を求められる
プロンプト:はじめてのWPFアプリ
# 依頼
Windowsデスクトップアプリを作ってほしい。

# 開発環境 - .NET 10 - WPF(XAML) - C# - Visual Studioの画面は使わない。dotnetコマンドだけで作業する。
# プロジェクト・フォルダ作成 - HelloWpf という名前のサブフォルダを作成し、以降の作業はサブフォルダで行う。 - すでにサブフォルダがあれば、そのサブフォルダに移動して以降の作業を進める。 - dotnet new wpf でプロジェクトを作成する。名前空間は HelloWpf とする。
# 画面 - ウィンドウの題名は「いま何時」、幅360、高さ200とする。 - ウィンドウは画面の中央に表示する。 - 縦に2つの部品を並べる。 - 上:文字を表示する部品。起動時は「ボタンを押すと時刻を表示する」と表示する。 - 下:ボタン。表示する文字は「いま何時?」とする。 - 文字とボタンは、いずれも横方向の中央に置く。 - 上の文字は大きめ(24ポイント程度)にする。
# 動作 - ボタンを押すと、上の文字が現在の日時に変わる。 - 日時の書式は「2026年8月28日 14時05分30秒」のように、年月日と時分秒を漢字で区切って表示する。
# ビルドと実行 - dotnet build でビルドし、警告とエラーが無いことを確認する。 - エラーが出た場合は内容を読んで修正し、警告とエラーが無くなるまでくり返す。 - dotnet run で起動し、ウィンドウが表示されることを確認する。
# 制約 - 外部ライブラリ(NuGetパッケージ)は使わない。 - MainWindow.xaml と MainWindow.xaml.cs の2ファイルについて、全文を分けて示してほしい。 - 初心者が読むので、要所に日本語のコメントを入れてほしい。 - 各行が何をしているかを、コードの後に日本語で説明してほしい。
依頼文の最後にある「各行が何をしているかを説明してほしい」の1行は、省かないほうがよい。Codexは、頼めば解説を付ける。自分の手元に、そのコードだけに対応した説明書ができることになる。分からない語が出てきたら、そのまま「Marginとは何か」と重ねて尋ねればよい。

Codexが書いたXAML

Codexが作成したMainWindow.xamlの全文が次のものである。ファイルはCodexが書き込むので、貼り付ける作業は無い。読んで、依頼したとおりの画面になっているかを確かめる。
MainWindow.xaml(画面の設計図)
<Window x:Class="HelloWpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="いま何時"
        Width="360"
        Height="200"
        WindowStartupLocation="CenterScreen">
    <!-- 画面を上下2行に分け、文字とボタンを縦に並べます。 -->
    <Grid Margin="16">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

<!-- 現在の案内または日時を表示する部分です。 --> <TextBlock x:Name="DateTimeTextBlock" Grid.Row="0" Text="ボタンを押すと時刻を表示する" FontSize="24" TextAlignment="Center" TextWrapping="Wrap" HorizontalAlignment="Center" VerticalAlignment="Center" />
<!-- Click属性で、押されたときに実行する処理を指定します。 --> <Button Grid.Row="1" Content="いま何時?" HorizontalAlignment="Center" Padding="20,8" Click="ShowDateTimeButton_Click" /> </Grid> </Window>
主な記述の意味を下表に示す。3行目までの xmlns で始まる長い行は、WPFの部品の名前を解釈するための決まり文句である。すべてのXAMLの先頭に必ず現れるもので、意味を覚える必要はない。

読むときに1か所だけ確かめてほしい点がある。1行目の x:Class に書かれた名前が、プロジェクト名と一致しているかである。ここが食い違うと、ビルド時に「型または名前空間の名前 'MainWindow' が見つかりません」というエラーになる。もっとも、Codexは自分でビルドして確認するので、食い違ったままになることはまずない。読み方を知っておく、という程度でよい。
MainWindow.xaml の主な記述
記述意味
x:Class="HelloWpf.MainWindow"この設計図と対になるC#のクラス名。プロジェクト名と一致していなければならない
Title="いま何時"ウィンドウの題名。タイトルバーに表示される
Width="360" Height="200"ウィンドウの幅と高さ
WindowStartupLocation="CenterScreen"起動時にウィンドウを画面の中央へ置く
<StackPanel Margin="20">中の部品を縦に並べる入れ物。周囲に20の余白を空ける
x:Name="TimeText"この文字部品にTimeTextという名前を付ける。C#から書き替えるために必要である
FontSize="24"文字の大きさ
Margin="0,0,0,20"左・上・右・下の余白。ここでは下だけ20空けている
Content="いま何時?"ボタンに表示する文字。TextBlockのTextに相当する
Click="ShowTimeButton_Click"押されたときに呼び出すC#の処理の名前
<!-- -->コメント。人が読むための覚え書きで、動作には影響しない

Codexが書いたC#

続いてMainWindow.xaml.csの全文である。ファイル名が「.xaml.cs」で終わっていることに注目してほしい。MainWindow.xaml と対になっていることが、名前から分かるようになっている。
MainWindow.xaml.cs(動きの記述)
<Window x:Class="HelloWpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="いま何時"
        Width="360"
        Height="200"
        WindowStartupLocation="CenterScreen">
    <!-- 画面を上下2行に分け、文字とボタンを縦に並べます。 -->
    <Grid Margin="16">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

<!-- 現在の案内または日時を表示する部分です。 --> <TextBlock x:Name="DateTimeTextBlock" Grid.Row="0" Text="ボタンを押すと時刻を表示する" FontSize="24" TextAlignment="Center" TextWrapping="Wrap" HorizontalAlignment="Center" VerticalAlignment="Center" />
<!-- Click属性で、押されたときに実行する処理を指定します。 --> <Button Grid.Row="1" Content="いま何時?" HorizontalAlignment="Center" Padding="20,8" Click="ShowDateTimeButton_Click" /> </Grid> </Window>
こちらも主な記述の意味を下表に示す。C#のコードは、上から順に実行される命令の並びではなく、「こういう場合には、これをする」という手続きの集まりである。ボタンが押されるという出来事(イベント)が起きたときに、対応する手続きが呼び出される。この呼び出される手続きをイベントハンドラーと呼ぶ。

注目してほしいのは、XAMLに書いた2つの名前が、C#にそのまま現れている点である。x:Name="TimeText" と書いたから、C#で TimeText.Text と書ける。Click="ShowTimeButton_Click" と書いたから、C#に同じ名前の手続きが必要になる。片方だけを書き替えると対応が崩れるので、Codexへ修正を頼むときはどちらのファイルの話かを明示するとよい。
日時の書式にある yyyy や HH は、あらかじめ決められた記号である。「HH」を「hh」にすれば12時間制になり、「ss」を消せば秒が消える。記号の一覧は公式ドキュメントにまとまっている(カスタム日時形式文字列)。もっとも、覚える必要はない。「12時間制で、午前・午後を付けて表示してほしい」とCodexへ頼めばよい。
MainWindow.xaml.cs の主な記述
記述意味
using System;日時などの基本的な機能を、短い名前で使えるようにする宣言
namespace HelloWpf名前の所属先。XAMLのx:Classに書いた前半部分と一致させる
public partial class MainWindow : Windowウィンドウを表すクラス。partialは「XAMLの側と合わせて1つのクラスになる」という意味である
public MainWindow()ウィンドウが作られるときに1度だけ実行される部分
InitializeComponent();XAMLに書いた部品を実際に組み立てる。これが無いと画面に何も出ない
private void ShowTimeButton_Click(...)ボタンが押されたときに呼ばれる手続き。名前はXAMLのClickに書いた名前と一致させる
DateTime now = DateTime.Now;現在の日時を取り出し、nowという名前を付けて覚えておく
now.ToString("yyyy年M月d日 HH時mm分ss秒")日時を指定の形式の文字に変える。yyyyは西暦4桁、HHは24時間制の時である
TimeText.Text = ‥‥;XAMLでTimeTextと名付けた部品の表示文字を書き替える
// と /// <summary>コメント。動作には影響しない

ビルドして動かす

ビルドと実行はCodexが行う。依頼文に書いておいたので、コードを書き終えたCodexは続けて dotnet build を実行し、警告とエラーが無いことを確認し、dotnet run でアプリを起動する。人間の画面には、Codexの作業の記録と、その後に表示されたウィンドウが現れる。
C#やXAMLで書かれた文字の集まりは、そのままではWindowsが理解できない。これをWindowsが実行できる形(EXEファイル)に変換する作業をビルドという。変換に失敗すればエラーが表示され、実行までたどり着かない。ここでエラーを読むのはCodexであり、人間は待っていればよい
実行したアプリのウィンドウ。上に日時、下に「いま何時?」ボタンが表示されている
ボタンを押すと現在の日時が表示される
ウィンドウが表示されたら、人間の仕事が始まる。確かめることは次の4点である。
  1. 「いま何時?」ボタンを押すと、上の文字が現在の日時に変わるか。
  2. もう一度押すと、秒の部分が進んでいるか。
  3. 文字の大きさ、ボタンの位置、ウィンドウの大きさが、頼んだとおりか。
  4. ウィンドウの右上の×を押して、正しく終わるか。
これが、自分の依頼で作られた最初のWindowsアプリである。行ったことは、日本語で条件を並べ、動いたものを確かめただけである。コードを1行も書いていないし、Visual Studioの画面も開いていない。
アプリを閉じると、dotnet run も終わる。もう一度動かしたいときは、Codexへ「もう一度起動してほしい」と頼めばよい。作られたEXEファイルは、プロジェクトのフォルダの下の bin\Debug\net10.0-windows に置かれているので、そこから直接ダブルクリックしても動く。ただし、この段階のEXEは開発中のものであり、他人のパソコンへ配ることは想定していない。配布できる形にする手順は「5.3 ファイル一括リネームツール」で扱う。

自動更新を追加してもらう

動いたら、次は改良である。ボタンを押すたびに時刻が止まって見えるのは物足りないので、1秒ごとに自動で更新されるようにしてみる。追加の依頼は短く書けばよい。前の依頼の続きとして、同じCodexへ話し掛ける形で頼む。
プロンプト:自動更新の追加
先のHelloWpfを改良してほしい。

# 追加する動作 - 起動した時点から、1秒ごとに表示中の日時を自動で更新する。 - ボタンを押したときも、これまでどおり現在の日時を表示する。 - ボタンの文字を「いま何時?」から「今すぐ更新」に変える。
# 条件 - 外部ライブラリは使わない。 - 変更したファイルの全文を示し、どこを変えたのかを説明してほしい。 - 変更後、dotnet build でビルドし、dotnet run で起動して確認する。
C#には、次のような数行が加わる。DispatcherTimerは、決めた間隔で処理を呼び出してくれるWPFの部品である。
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += (sender, e) => UpdateTime();
timer.Start();
1行目で時計を用意し、2行目で間隔を1秒に決め、3行目で「時が来たらUpdateTime()を呼べ」と登録し、4行目で動かし始める、と読める。時刻を表示する処理が、ボタンを押したときと時計から呼ばれたときの2か所で必要になるため、Codexはその処理を UpdateTime() という別の手続きにまとめてくるはずである。同じ処理を2度書かず、名前を付けて1か所にまとめるのは、プログラムの基本的な作法である。
このように、第5章の作業は「最初の依頼で骨組みを作り、動かして確かめ、短い依頼で改良する」という進め方になる。1回の依頼で完成させようとせず、動く状態を保ちながら少しずつ足していくほうが、つまずいたときに原因を見つけやすい。

よくあるつまずきと対処

Visual Studioの画面を開かない進め方では、つまずきの現れ方も変わる。人間が向き合うのは、Codexの作業が止まるか、動いたアプリの様子がおかしいかの2通りである。よくある症状と対処を下表にまとめる。

共通する対処は1つである。見たままをCodexへ伝える。エラー番号や行番号を人間が調べる必要はない。「押しても反応が無い」「文字が小さい」「すぐ消える」で十分に伝わる。第4章までの「エラーメッセージをそのまま貼り付ける」という作法は、第5章ではCodexの側の仕事になっている。
本項で扱ったのは、部品2つだけの小さなウィンドウである。次の「5.3 ファイル一括リネームツール」では、フォルダを選ぶ、一覧を表示する、実行前に結果を確かめる、といった実用的な画面を作り、画面を作ってから配布するまでの流れを通して体験する。
はじめてのWPFアプリでよくあるつまずき
症状原因対処
Codexが「dotnet コマンドが見つからない」と報告する.NET 10 SDKが入っていない、またはCodexを起動したままインストールしたdotnet --list-sdks を実行して確認する。Codexを再起動する。それでも出なければ5.1に戻ってSDKを入れる
Codexが同じエラーの修正を何度もくり返している依頼の前提が食い違っている(対象のバージョンや部品名)いったん止め、「.NET 10のWPFで作ること」を伝え直す。それでも直らなければ、フォルダを作り直して最初から依頼する
コードは表示されたが、ビルドも実行もされない依頼文にビルドと実行の指示が無い「dotnet build でビルドし、dotnet run で起動してほしい」と追加で依頼する
ウィンドウは出るが、文字もボタンも表示されないInitializeComponent(); が無い、または画面の部品が入れ物の外に置かれている「ウィンドウが空で表示される」とCodexへ伝える
ボタンを押しても何も起きないXAMLのClickと、C#の手続きの名前が対応していない「ボタンを押しても反応が無い」とCodexへ伝える。2つのファイルを見直させる
ボタンの文字が枠から見切れるWidthの指定が文字数に対して小さい「ボタンの文字が見切れている。幅を広げてほしい」と依頼する
画面の日本語が文字化けするソースファイルの文字コードが異なる形式で保存されている「ソースファイルをUTF-8で保存し直してほしい」と依頼する
直したはずの内容が反映されない前回のビルド結果が残っている「dotnet clean を実行してから、もう一度ビルドしてほしい」と依頼する
アプリが起動した直後に消える起動時の処理でエラーが起きている「起動直後に落ちる」とCodexへ伝える。Codexが実行時のエラー内容を確認する

参考サイト

(この項おわり)
header