mcpField
W
winforms

winforms

github.com/managedcode开发49646 次安装1 天前更新
代码仓库

关于 winforms

用于开发和现代化 Windows Forms 应用的技能,面向处理事件驱动桌面界面和传统业务应用的开发者。它强调保护设计器文件、以 MVP 分离界面与逻辑、数据绑定、验证,以及逐步迁移到现代 .NET。

主要功能

  1. 01避免直接编辑设计器文件
  2. 02使用 MVP 分离界面与逻辑
  3. 03采用 BindingSource 数据绑定
  4. 04指导异步 I/O 与验证
  5. 05涵盖渐进式 .NET 迁移

适用场景

  1. 01重构过大的窗体
  2. 02将 WinForms 迁移到现代 .NET
  3. 03实现数据绑定与验证
  4. 04让界面工作流中的 I/O 保持响应

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/managedcode/dotnet-skills --skill winforms

安装后在 Claude Code 中输入/winforms确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

manifest.json
references/
migration.md
patterns.md

详细介绍

Windows Forms

适用场景

  • 开发 Windows Forms UI、事件驱动工作流或经典 LOB 应用
  • 将 WinForms 从 .NET Framework 迁移到现代 .NET
  • 清理过于庞大的窗体代码或设计器耦合
  • 实现数据绑定、验证或控件自定义

工作流

  1. 遵守设计器边界 — 切勿直接编辑 .Designer.cs;重新生成时更改会丢失。
  2. 将业务逻辑与窗体分离 — 使用 MVP(Model-View-Presenter)模式。窗体负责协调 UI;Presenter 包含逻辑;服务负责数据访问。
    // 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); }
            };
        }
    }
    
  3. 在 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>());
    
  4. 使用数据绑定,通过 BindingSource 和 INotifyPropertyChanged 代替手动填充控件。完整的数据绑定模式请参阅 references/patterns.md。
  5. 对 I/O 操作使用 async/await — 加载期间禁用控件,使用 Progress<T> 报告进度。切勿阻塞 UI 线程。
  6. 使用 ErrorProvider 和 Validating 事件进行验证。保存前调用 ValidateChildren()。
  7. 渐进式现代化 — 优先改进结构,而不是一次性重写。条件允许时使用 .NET 8+ 功能(按钮命令、内置图标)。

当前上游说明

  • 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"]

关键决策

决策指导
MVP 与 MVVMWinForms 优先使用 MVP — 它更适合事件驱动模型,也更简单
BindingSource 与手动绑定列表/详情绑定始终优先使用 BindingSource
同步与异步 I/O始终使用异步 — 仅在事件处理程序中使用 async void
自定义控件当窗体超过约 300 行时,将可复用部分提取为 UserControl
.NET Framework → .NET使用官方迁移指南;先确认设计器兼容性

交付内容

  • 更不易出错、UI 与逻辑清晰分离的窗体代码
  • 可测试 Presenter 的 MVP 模式
  • 针对 WinForms 密集型应用的务实现代化指导
  • 减少手动接线的数据绑定和验证模式

验证

  • 设计器文件保持稳定,不进行手动编辑
  • 窗体不充当应用服务层
  • 异步操作不会阻塞 UI 线程
  • 使用 ErrorProvider 一致地实现验证
  • 在目标环境中测试仅限 Windows 的运行时行为

参考资料

  • references/patterns.md - WinForms 架构模式(MVP、MVVM、Passive View)、数据绑定、验证、窗体通信、线程处理、DI 配置和 .NET 8+ 功能
  • references/migration.md - 从 .NET Framework 迁移到现代 .NET 的分步指南、常见问题、部署选项和渐进式迁移策略

评论

支持 Markdown