Windows Forms Applications

37.1 Modern WinForms on .NET

Target net8.0-windows with <UseWindowsForms>true</UseWindowsForms>. High-DPI support (<ApplicationHighDpiMode>PerMonitorV2</ApplicationHighDpiMode>), dark mode (experimental in .NET 9+), async-friendly APIs (Control.InvokeAsync in .NET 9+), and the out-of-process designer.

VB Application Framework: startup form, single instance, splash screen, ApplicationEvents.vb (Startup, Shutdown, UnhandledException, StartupNextInstance).

37.2 Structuring a WinForms App (Testable)

' Program bootstrap with DI (instead of the default startup form)
Module Program
    <STAThread>
    Sub Main()
        Application.SetHighDpiMode(HighDpiMode.PerMonitorV2)
        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)

        Dim builder = Host.CreateApplicationBuilder()
        builder.Services.AddSingleton(Of ICustomerService, CustomerService)()
        builder.Services.AddTransient(Of MainForm)()
        Using host = builder.Build()
            Application.Run(host.Services.GetRequiredService(Of MainForm)())
        End Using
    End Sub
End Module

Public Class MainForm
    Private ReadOnly _service As ICustomerService
    Private ReadOnly _binding As New BindingSource()

    Public Sub New(service As ICustomerService)
        InitializeComponent()
        _service = service
        dgvCustomers.DataSource = _binding
    End Sub

    Private Async Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Await RefreshAsync()
    End Sub

    Private Async Function RefreshAsync() As Task
        UseWaitCursor = True
        Try
            _binding.DataSource = New BindingList(Of Customer)((Await _se
…

37.3 WinForms Topics Checklist

Layout (Anchor, Dock, TableLayoutPanel, FlowLayoutPanel, SplitContainer), menus/toolbars/status bars, dialogs (OpenFileDialog, TaskDialog in .NET 5+), DataGridView (binding, formatting, virtual mode, custom columns), ListView/TreeView, user controls and custom controls (OnPaint, double buffering), drag and drop, clipboard, printing (PrintDocument, PrintPreviewDialog), GDI+ drawing, NotifyIcon (tray apps), localization (Localizable forms), accessibility (AccessibleName), the MVP pattern for testability, WebView2 for embedding web content.