AgentStack
SKILL verified MIT Self-run

Winforms

skill-managedcode-dotnet-skills-winforms · by managedcode

Build, maintain, or modernize Windows Forms applications with practical guidance on designer-driven UI, event handling, data binding, MVP separation, and migration to modern .NET. USE FOR: working on Windows Forms UI, event-driven workflows, or classic LOB applications; migrating WinForms from .NET Framework to modern .NET; cleaning up oversized form code. DO NOT USE FOR: unrelated stacks; generi…

No reviews yet
0 installs
5 views
0.0% view→install

Install

$ agentstack add skill-managedcode-dotnet-skills-winforms

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

Are you the author of Winforms? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Windows Forms

Trigger On

  • working on Windows Forms UI, event-driven workflows, or classic LOB applications
  • migrating WinForms from .NET Framework to modern .NET
  • cleaning up oversized form code or designer coupling
  • implementing data binding, validation, or control customization

Workflow

  1. Respect designer boundaries — never edit .Designer.cs directly; changes are lost on regeneration.
  2. Separate business logic from forms — use MVP (Model-View-Presenter) pattern. Forms orchestrate UI; presenters contain logic; services handle data access.

```csharp // 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); } }; } } ```

  1. Use DI from Program.cs (.NET 6+):

``csharp var services = new ServiceCollection(); services.AddSingleton(); services.AddTransient(); using var sp = services.BuildServiceProvider(); Application.Run(sp.GetRequiredService()); ``

  1. Use data binding via BindingSource and INotifyPropertyChanged instead of manual control population. See [references/patterns.md](references/patterns.md) for complete binding patterns.
  2. Use async/await for I/O operations — disable controls during loading, use Progress for progress reporting. Never block the UI thread.
  3. Validate with ErrorProvider and the Validating event. Call ValidateChildren() before save operations.
  4. Modernize incrementally — prefer better structure over big-bang rewrites. Use .NET 8+ features (button commands, stock icons) when available.

Current Upstream Notes

  • The refreshed Windows Forms overview remains focused on Windows desktop, designer-driven controls, events, data binding, and migration to modern .NET. Keep WinForms guidance pragmatic: improve form boundaries and designer safety before proposing a framework rewrite.
  • For docs-driven updates, validate whether the app targets .NET Framework, modern .NET, or mixed libraries before changing project format, designer files, or deployment assumptions.
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 | Prefer MVP for WinForms — simpler with event-driven model | | BindingSource vs manual | Always prefer BindingSource for list/detail binding | | Sync vs async I/O | Always async — use async void only for event handlers | | Custom controls | Extract reusable UserControl when form grows beyond ~300 lines | | .NET Framework → .NET | Use the official migration guide; validate designer compatibility first |

Deliver

  • less brittle form code with clear UI/logic separation
  • MVP pattern with testable presenters
  • pragmatic modernization guidance for WinForms-heavy apps
  • data binding and validation patterns that reduce manual wiring

Validate

  • designer files stay stable and are not hand-edited
  • forms are not acting as the application service layer
  • async operations do not block the UI thread
  • validation is implemented consistently with ErrorProvider
  • Windows-only runtime behavior is tested on target

References

  • [references/patterns.md](references/patterns.md) - WinForms architectural patterns (MVP, MVVM, Passive View), data binding, validation, form communication, threading, DI setup, and .NET 8+ features
  • [references/migration.md](references/migration.md) - step-by-step migration from .NET Framework to modern .NET, common issues, deployment options, and gradual migration strategies

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.