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.