winforms について
Windows Formsアプリの開発と近代化を支援するスキルです。イベント駆動型のデスクトップUIや従来型の業務アプリを扱う開発者向けに、デザイナーファイルの保護、MVPによる分離、データバインディング、検証、段階的な.NET移行を案内します。
主な機能
- 01デザイナーファイルの直接編集回避
- 02MVPによるUIとロジックの分離
- 03BindingSourceによるデータバインディング
- 04非同期I/Oと入力検証の指針
- 05段階的な.NET移行の案内
活用シーン
- 01大規模なフォームの再構成
- 02WinFormsのモダンな.NETへの移行
- 03データバインディングと検証の実装
- 04UIワークフローでのI/O応答性維持
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ managedcode/ dotnet-skills --skill winformsインストール後、Claude Code で/winformsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
manifest.jsonreferences/migration.mdpatterns.md詳細
Windows Forms
Trigger On
- Windows Forms の UI、イベント駆動型ワークフロー、または従来型の LOB アプリケーションを扱う場合
- WinForms を .NET Framework から最新の .NET に移行する場合
- 肥大化したフォームコードやデザイナーとの結合を整理する場合
- データバインディング、検証、またはコントロールのカスタマイズを実装する場合
Workflow
- デザイナーの境界を尊重する —
.Designer.csを直接編集しないでください。再生成時に変更が失われます。 - ビジネスロジックをフォームから分離する — MVP(Model-View-Presenter)パターンを使用してください。フォームは UI を制御し、プレゼンターはロジックを含み、サービスはデータアクセスを担当します。
// View interface — forms implement this public interface ICustomerView { string CustomerName { get; set; } event EventHandler SaveRequested; void ShowError(string message); } // Presenter — testable without UI public class CustomerPresenter { private readonly ICustomerView _view; private readonly ICustomerService _service; public CustomerPresenter(ICustomerView view, ICustomerService service) { _view = view; _service = service; _view.SaveRequested += async (s, e) => { try { await _service.SaveAsync(_view.CustomerName); } catch (Exception ex) { _view.ShowError(ex.Message); } }; } } - Program.cs から DI を使用する(.NET 6 以降):
var services = new ServiceCollection(); services.AddSingleton<ICustomerService, CustomerService>(); services.AddTransient<MainForm>(); using var sp = services.BuildServiceProvider(); Application.Run(sp.GetRequiredService<MainForm>()); - 手動でコントロールに値を設定する代わりに、
BindingSourceとINotifyPropertyChangedによるデータバインディングを使用してください。バインディングパターンの詳細は、references/patterns.md を参照してください。 - I/O 操作には async/await を使用してください。読み込み中はコントロールを無効にし、進捗報告には
Progress<T>を使用してください。UI スレッドをブロックしないでください。 ErrorProviderとValidatingイベントを使用して検証してください。保存処理の前にValidateChildren()を呼び出してください。- 段階的に最新化する — 大規模な一括書き換えより、構造の改善を優先してください。利用可能な場合は、.NET 8 以降の機能(ボタンコマンド、標準アイコン)を使用してください。
Current Upstream Notes
- 2026 年 8 月の Windows Forms の概要は、引き続き Windows デスクトップ、デザイナー主導のコントロール、イベント、データバインディング、および最新の .NET への移行に焦点を当てています。フレームワーク選択の指針に変更はありません。書き換えを提案する前に、フォームの境界とデザイナーの安全性を改善してください。
- ドキュメントに基づく更新では、プロジェクト形式、デザイナーファイル、またはデプロイに関する前提を変更する前に、アプリが .NET Framework、最新の .NET、または混在するライブラリのどれを対象としているかを確認してください。
flowchart LR
A["Form event"] --> B["Presenter handles logic"]
B --> C["Service layer / data access"]
C --> D["Update view via interface"]
D --> E["Validate and display results"]
Key Decisions
| Decision | Guidance |
|---|---|
| MVP vs MVVM | WinForms では MVP を優先してください。イベント駆動型モデルではよりシンプルです |
| BindingSource vs manual | リスト/詳細のバインディングには、常に BindingSource を優先してください |
| Sync vs async I/O | 常に非同期にしてください。async void はイベントハンドラーでのみ使用してください |
| Custom controls | フォームが約 300 行を超えたら、再利用可能な UserControl を抽出してください |
| .NET Framework → .NET | 公式の移行ガイドを使用し、まずデザイナーとの互換性を確認してください |
Deliver
- UI とロジックが明確に分離された、壊れにくいフォームコード
- テスト可能なプレゼンターを備えた MVP パターン
- WinForms を多用するアプリ向けの実践的な最新化ガイダンス
- 手作業による配線を減らすデータバインディングと検証のパターン
Validate
- デザイナーファイルが安定しており、手作業で編集されていない
- フォームがアプリケーションサービス層の役割を担っていない
- 非同期操作が UI スレッドをブロックしていない
- ErrorProvider を使用した一貫した検証が実装されている
- Windows 固有の実行時動作が対象環境でテストされている
References
- references/patterns.md - WinForms のアーキテクチャパターン(MVP、MVVM、Passive View)、データバインディング、検証、フォーム間通信、スレッド処理、DI の設定、.NET 8 以降の機能
- references/migration.md - .NET Framework から最新の .NET への段階的な移行、よくある問題、デプロイの選択肢、段階的な移行戦略
コメント
Markdown 対応