Edit

What's new in Windows Forms for .NET 11 Preview

This article provides a high-level overview of what's new with Windows Forms (WinForms) in .NET 11 Preview. For detailed information, see Release announcements. Use the release announcements to get an overview of the entire .NET 11 release. The rest of this article highlights the most important changes to Windows Forms.

.NET 11 Preview 7 was released in August 2026.

Release announcements

Each release announcement provides detailed information about Windows Forms changes for .NET 11:

Visual styles and appearance

System.Windows.Forms.Application.SetDefaultVisualStylesMode and the new System.Windows.Forms.Control.VisualStylesMode property let you opt in to a refreshed rendering pipeline at the application and control level. Choose between the classic renderer (VisualStylesMode.Classic), visual styles turned off entirely (VisualStylesMode.Disabled), and the modern renderer (VisualStylesMode.Net11). VisualStylesMode.Latest always resolves to the newest mode the runtime supports. Child controls default to VisualStylesMode.Inherit, so the setting cascades from parent to child.

The Net11 mode brings modernized rendering for Button, CheckBox, RadioButton, GroupBox, TextBox, and RichTextBox. The FlatStyle property on buttons and checkboxes, and the BorderStyle property on text boxes, define the render style. The Property Grid now exposes the Padding property on text boxes and rich text boxes, and applies it when VisualStylesMode is Net11 or newer.

Control.VisualStylesMode is an ambient property, similar to BackColor or Font. Resolution walks up the parent chain, and when it reaches the top level, it falls through to Application.DefaultVisualStylesMode. Call Control.GetVisualStylesModeChangeImpact to see what needs updating when modes change, and use the Control.EffectiveVisualStylesMode property to get the resolved value after inheritance.

using System.Windows.Forms;

Application.SetDefaultVisualStylesMode(VisualStylesMode.Net11);

Form form = new()
{
  Text = "Modern visual styles",
  VisualStylesMode = VisualStylesMode.Latest,
};

ComboBox combo = new() { Dock = DockStyle.Top };
combo.Items.AddRange(["One", "Two", "Three"]);
form.Controls.Add(combo);

Application.Run(form);

React to system visual settings

System.Windows.Forms.Application.SystemVisualSettings exposes accent color, high-contrast state, keyboard-cue visibility, client-area animation settings, focus-border metrics, and text scale factor as a single snapshot. The new System.Windows.Forms.Application.SystemVisualSettingsChanged event fires whenever one of those categories changes, so you can update only the affected UI instead of rebuilding theme resources on every notification. System.Windows.Forms.SystemVisualSettingsChangedEventArgs.Changed is a SystemVisualSettingsCategories flags value that indicates which categories changed. Controls can override OnSystemVisualSettingsChanged to respond locally.

using System.Drawing;
using System.Windows.Forms;

Application.SystemVisualSettingsChanged += (sender, e) =>
{
  if ((e.Changed & SystemVisualSettingsCategories.AccentColor) != 0)
  {
    Color accent = e.NewSettings.AccentColor;
    Console.WriteLine($"Accent color changed to {accent}.");
  }

  if ((e.Changed & SystemVisualSettingsCategories.TextScale) != 0)
  {
    Console.WriteLine($"Text scale is now {e.NewSettings.TextScaleFactor:P0}.");
  }
};

Deferred form reveal

System.Windows.Forms.FormRevealMode gives applications control over when a form becomes visible during startup. FormRevealMode.Deferred keeps a form concealed until its initial layout and theming settle, avoiding the brief flash of an unstyled window when dark mode or the new visual styles apply after the form first shows. FormRevealMode.Classic preserves the existing show-immediately behavior, and FormRevealMode.Inherit follows the value set with Application.SetDefaultFormRevealMode. Call Application.IsFormRevealDeferred to get the resolved state, and handle the Form.FormRevealModeChanged event when the value changes.

using System.Windows.Forms;

Application.SetDefaultVisualStylesMode(VisualStylesMode.Net11);
Application.SetDefaultFormRevealMode(FormRevealMode.Deferred);

Form form = new() { Text = "No unstyled flash on startup" };
Application.Run(form);

Suspend painting during bulk mutations

The new System.Windows.Forms.ISupportSuspendPainting interface and the ControlMutationExtensions.SuspendPainting extension method combine BeginUpdate/EndUpdate and SuspendLayout/ResumeLayout into a single IDisposable scope. LayoutSuspendTraversal controls whether the suspension applies to the target only or to the target and all of its descendants. This approach is useful when you apply changes to nested TableLayoutPanel containers with auto-sizing, where suspension prevents layout storms and flicker.

ComboBox, ListBox, ListView, RichTextBox, and TreeView now implement ISupportSuspendPainting. They route their established suspension patterns (BeginUpdate/EndUpdate) through the new interface, so bulk edits avoid flicker without managing multiple paired calls. For all other controls, the suspension behavior is new.

using System.Windows.Forms;

ListBox list = new();

using (list.SuspendPainting(LayoutSuspendTraversal.Target))
{
  for (int i = 0; i < 10_000; i++)
  {
    list.Items.Add($"Item {i}");
  }
}

Toggle-switch appearance for CheckBox and RadioButton

System.Windows.Forms.Appearance.ToggleSwitch is a new value for CheckBox.Appearance that renders the control as a switch under VisualStylesMode.Net11. Existing Checked, CheckedChanged, and data-binding behavior stays unchanged, so you don't need code updates when you switch a CheckBox to the new appearance. You can modernize checkbox controls to align with contemporary UI conventions without encountering breaking changes.

using System.Windows.Forms;

CheckBox toggle = new()
{
  Text = "Enable notifications",
  Appearance = Appearance.ToggleSwitch,
  Checked = true,
};

Important

Rendering behavior for Visual Styles and the associated new APIs isn't final yet and continues to change until .NET 11 reaches GA. Based on exploratory testing and customer feedback, controls using non-classic Visual Style settings might occupy more or less space in upcoming .NET 11 releases (RC, GA) than they do in Preview 7. The behavior of the new APIs might likewise change in detail or in specific scenarios.

For this reason, avoid pixel-perfect design when you adopt these features. Prefer layout-based approaches using TableLayoutPanel and FlowLayoutPanel, which adapt automatically to changes in control metrics.

Clipboard

  • Clipboard.GetText with TextDataFormat.Rtf now correctly reads RTF clipboard data that doesn't include a null terminator. This fix resolves an issue where valid RTF content copied from applications such as PowerPoint returned an empty string.

  • GetDataObject() returns an IDataObject that can contain bitmap data placed on the clipboard, and GetImage() retrieves the bitmap image from that data object. GetImage() also retrieves the image directly from the clipboard. GetImage() now retrieves images through the typed clipboard pipeline by calling TryGetData<Image>(DataFormats.Bitmap, autoConvert: true, ...) and returns null when it can't retrieve an image.

    The following code now round-trips bitmap images when bitmap is an existing Bitmap and you get the image through the returned data object:

    // Round-trips again on .NET 11
    Clipboard.SetImage(bitmap);
    Image? image = Clipboard.GetDataObject()?.GetImage();
    

ToolStrip

  • ToolStripDropDown now preserves modal menu tracking during focus changes, so SmartTag and dropdown UI close normally when users switch tab pages or move focus to other controls. This fixes a regression that caused dropdowns to remain open inappropriately.

  • ToolStrip controls with TabStop=true no longer incorrectly activate menu handling after tab navigation. Previously, this behavior prevented controls such as TreeView from receiving arrow key input.

  • ToolStripDropDownMenu scrolling now correctly handles menu boundaries without out-of-range scrolling or unintentionally dismissing the dropdown.

  • ToolStrip DPI changes now preserve the previous device DPI during the DPI change path, so scaling logic runs correctly when you move controls between displays with different DPI settings.

Layout

  • AnchorLayoutV2 now properly initializes missing anchor metadata when anchored controls are replaced during a suspended layout pass, preventing layout inconsistencies.

Designer

  • Hosted Windows Forms designers can now paste controls through CommandSet.OnMenuPaste again, restoring paste functionality that was previously broken.

  • Collection editor captions for custom controls now display the underlying control type instead of the generated ControlProxy<T> wrapper name, making it easier to identify controls in the designer.

PropertyGrid

Dark mode

  • ProgressBar now has default foreground and background colors for dark mode rendering, improving visual consistency in Fluent-themed applications.

Bug fixes

  • Control: The SendKeys sequential immediate modifier parsing (such as ^a^c, +a+c, %f%t) regression is fixed. The KeyboardToolTipStateMachine no longer throws KeyNotFoundException when focus changes during a tooltip popup event.

  • ListBox: IsSynchronized values are now correct across ListBox collections.

  • NumericUpDown: The button rendering regression that occurred when visual styles are disabled is fixed.

  • SplitContainer: The control now handles a transient GDI+ ExternalException during display-session transition when calling RepaintSplitterRect.

  • ToolStrip: The scroll-down button no longer throws when scrolling. Indeterminate and checked ToolStripMenuItem icons are now visible in dark mode.

  • PropertyGrid: Property Page button icon no longer changes when LargeButtons is toggled on high DPI. ResetHelpForeColor now correctly resets the foreground color instead of the background color.

  • PrintPreviewControl: ForeColor rendering is now correct when set to White.

  • Dark mode: LinkLabel contrast in Dark Mode is improved. TabControl nested in SplitContainer now matches dark mode. HelpProvider text is now visible in dark mode. ToolTip now switches to dark mode when SystemColorMode.Dark is set.