Novità di Windows Forms per .NET 11 RC 1

Questo articolo offre una panoramica generale delle novità di Windows Forms (WinForms) in .NET 11 RC 1. Per informazioni dettagliate, vedere Annunci di rilascio. Usare gli annunci di versione per ottenere una panoramica dell'intera versione .NET 11. Nella parte restante di questo articolo vengono evidenziate le modifiche più importanti apportate a Windows Forms.

.NET 11 RC 1 è stato rilasciato nel settembre 2026.

Annunci di rilascio

Ogni annuncio di versione fornisce informazioni dettagliate sulle modifiche Windows Forms per .NET 11:

Stili visivi e aspetto

System.Windows.Forms.Application.SetDefaultVisualStylesMode e la nuova proprietà System.Windows.Forms.Control.VisualStylesMode consentono di abilitare una pipeline di rendering aggiornata a livello di applicazione e di controllo. Scegliere tra il renderer classico (VisualStylesMode.Classic), gli stili di visualizzazione disattivati completamente (VisualStylesMode.Disabled) e il renderer moderno (VisualStylesMode.Net11). VisualStylesMode.Latest viene sempre risolto nella modalità più recente supportata dal runtime. I controlli figli sono impostati su VisualStylesMode.Inherit per impostazione predefinita, quindi l'impostazione viene ereditata dal padre al figlio.

La modalità Net11 introduce un rendering modernizzato per Button, CheckBox, RadioButton, GroupBox, TextBox e RichTextBox. La FlatStyle proprietà sui pulsanti e le caselle di controllo e la BorderStyle proprietà nelle caselle di testo definiscono lo stile di rendering. La Griglia delle proprietà espone ora la proprietà Padding nelle caselle di testo e nelle caselle RTF e l'applica quando VisualStylesMode è Net11 o versioni successive.

Control.VisualStylesMode è una proprietà di ambiente, simile a BackColor o Font. La risoluzione risale la catena degli elementi padre e, quando raggiunge il livello più alto, passa quindi a Application.DefaultVisualStylesMode. Chiamare Control.GetVisualStylesModeChangeImpact per visualizzare le esigenze di aggiornamento quando le modalità cambiano e usare la Control.EffectiveVisualStylesMode proprietà per ottenere il valore risolto dopo l'ereditarietà.

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);

Modalità chiosco

KioskModeManager offre un modo semplice per inserire un modulo in un chiosco multimediale o in un'esperienza con schermo condiviso senza logica di gestione delle finestre personalizzata. Può mantenere lo stato di un form durante il passaggio da e verso la modalità a schermo intero, impedire la sospensione dello schermo e del sistema, nascondere il puntatore dopo un periodo di inattività e rispondere alle scorciatoie da tastiera per attivare o disattivare la modalità a schermo intero. Il componente accetta un ContainerControl, quindi può essere utilizzato su un Form o UserControl e risolvere il form contenitore in fase di esecuzione.

using System.Windows.Forms;

ApplicationConfiguration.Initialize();

Form form = new()
{
    Text = "Kiosk",
};

using KioskModeManager kioskMode = new()
{
    ContainerControl = form,
    ToggleFullScreenKeys = Keys.F11,
    EscapeExitsFullScreen = true,
    TopMostInFullScreen = true,
    AlwaysOn = true,
    MousePointerAutoHideDelay = 3_000,
    FullScreen = true,
};

Application.Run(form);

KioskModeManager.FullScreen può anche essere collegato ai dati e KioskModeManager.FullScreenChanged segnala le transizioni tra la modalità a schermo intero e la finestra ripristinata. KioskModeManager.ToggleFullScreen() passa direttamente tra i due stati.

Reagire alle impostazioni visive del sistema

System.Windows.Forms.Application.SystemVisualSettings espone il colore di accento, lo stato del contrasto elevato, la visibilità degli indicatori di scelta rapida da tastiera, le impostazioni di animazione dell'area client, le metriche del bordo di attivazione e il fattore di scala del testo come un'unica istantanea. Il nuovo System.Windows.Forms.Application.SystemVisualSettingsChanged evento viene generato ogni volta che una di queste categorie cambia, quindi è possibile aggiornare solo l'interfaccia utente interessata anziché ricompilare le risorse del tema in ogni notifica. System.Windows.Forms.SystemVisualSettingsChangedEventArgs.Changed è un valore di flag SystemVisualSettingsCategories che indica quali categorie sono cambiate. I controlli possono sovrascrivere OnSystemVisualSettingsChanged per rispondere localmente.

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}.");
  }
};

Visualizzazione differita del modulo

System.Windows.Forms.FormRevealMode consente alle applicazioni di controllare quando un modulo diventa visibile durante l'avvio. FormRevealMode.Deferred mantiene un modulo nascosto fino a quando il layout iniziale e il tema si stabilizzano, evitando il breve flash di una finestra senza stili quando la modalità scura o i nuovi stili di visualizzazione si applicano dopo la prima visualizzazione del modulo. FormRevealMode.Classic mantiene il comportamento show-immediately esistente e FormRevealMode.Inherit segue il valore impostato con Application.SetDefaultFormRevealMode. Chiamare Application.IsFormRevealDeferred per ottenere lo stato risolto e gestire l'evento Form.FormRevealModeChanged quando cambia il valore.

using System.Windows.Forms;

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

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

Sospendi il rendering durante le modifiche in blocco

La nuova System.Windows.Forms.ISupportSuspendPainting interfaccia e il ControlMutationExtensions.SuspendPainting metodo di estensione combinano BeginUpdate/EndUpdate eSuspendLayout/ResumeLayout in un singolo IDisposable ambito. LayoutSuspendTraversal determina se la sospensione si applica solo all'elemento di destinazione o all'elemento di destinazione e a tutti i suoi elementi discendenti. Questo approccio è utile quando si applicano modifiche ai contenitori annidati TableLayoutPanel con ridimensionamento automatico, in cui la sospensione impedisce tempeste di layout e sfarfallio.

ComboBox, ListBox, ListView, RichTextBox e TreeView ora implementano ISupportSuspendPainting. Instradano i modelli di sospensione stabiliti (BeginUpdate/EndUpdate) attraverso la nuova interfaccia, quindi le modifiche bulk evitano sfarfallio senza gestire più chiamate abbinate. Per tutti gli altri controlli, il funzionamento della sospensione è una novità.

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}");
  }
}

Aspetto interruttore a levetta per CheckBox e RadioButton

System.Windows.Forms.Appearance.ToggleSwitch è un nuovo valore per CheckBox.Appearance che visualizza il controllo come interruttore in VisualStylesMode.Net11. Il comportamento esistente di Checked, CheckedChanged e del data binding rimane invariato, quindi non è necessario aggiornare il codice quando si passa al nuovo aspetto di CheckBox. È possibile modernizzare i controlli casella di controllo per allinearsi alle convenzioni dell'interfaccia utente contemporanea senza riscontrare modifiche di rilievo.

using System.Windows.Forms;

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

Importante

Il comportamento di rendering per gli stili di visualizzazione e le nuove API associate non sono ancora definitive e continuano a cambiare fino a quando .NET 11 raggiunge la disponibilità generale. Il comportamento delle nuove API potrebbe cambiare in modo analogo in dettaglio o in scenari specifici.

Per questo motivo, evitare la progettazione perfetta in pixel quando si adottano queste funzionalità. Preferisce approcci basati sul layout usando TableLayoutPanel e FlowLayoutPanel, che si adattano automaticamente alle modifiche nelle metriche di controllo.

Appunti

  • Clipboard.GetText con TextDataFormat.Rtf ora legge correttamente i dati RTF dagli appunti che non includono un carattere null di terminazione. Questa correzione risolve un problema per cui il contenuto RTF valido copiato da applicazioni come PowerPoint restituiva una stringa vuota.

  • GetDataObject() restituisce un oggetto IDataObject che può contenere dati bitmap posizionati negli Appunti e GetImage() recupera l'immagine bitmap da tale oggetto dati. GetImage() recupera anche l'immagine direttamente dagli Appunti. GetImage() ora ottiene le immagini tramite la pipeline tipizzata degli Appunti, tramite una chiamata a TryGetData<Image>(DataFormats.Bitmap, autoConvert: true, ...), e restituisce null se non riesce a ottenere un'immagine.

    Il codice seguente esegue ora il round trip delle immagini bitmap quando bitmap è esistente Bitmap e si ottiene l'immagine tramite l'oggetto dati restituito:

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

Barra degli strumenti

  • ToolStripDropDown ora mantiene il tracciamento dei menu modali durante i cambi di focus, quindi SmartTag e i menu a discesa si chiudono normalmente quando gli utenti passano da una scheda all'altra o spostano il focus su altri controlli. Questa correzione risolve una regressione che causava il fatto che i menu a discesa rimanessero aperti in modo inappropriato.

  • ToolStrip controlli con TabStop=true non attivano più erroneamente la gestione del menu dopo la navigazione tramite Tab. In precedenza, questo comportamento impediva ai controlli come TreeView la ricezione dell'input del tasto freccia.

  • ToolStripDropDownMenu lo scorrimento ora gestisce correttamente i confini del menu senza scorrere oltre i limiti o chiudere involontariamente il menu a discesa.

  • ToolStrip Le modifiche DPI mantengono ora il valore DPI precedente durante il percorso di modifica DPI, quindi la logica di ridimensionamento viene eseguita correttamente quando si spostano i controlli tra i display con impostazioni DPI diverse.

Layout

  • AnchorLayoutV2 ora inizializza correttamente i metadati di ancoraggio mancanti quando i controlli ancorati vengono sostituiti durante un passaggio di layout sospeso, impedendo le incoerenze del layout.

Progettazione

  • Le finestre di progettazione Windows Forms ospitate possono ora incollare nuovamente i controlli tramite CommandSet.OnMenuPaste, ripristinando la funzionalità incolla precedentemente interrotta.

  • Le etichette dell'editor della raccolta per i controlli personalizzati ora visualizzano il tipo di controllo sottostante anziché il nome del wrapper generato ControlProxy<T>, semplificando l'identificazione dei controlli nel designer.

PropertyGrid

Modalità scura

  • ProgressBar ora ha colori di primo piano e di sfondo predefiniti per il rendering in modalità scura, migliorando la coerenza visiva nelle applicazioni con tema Fluent.

Modifiche radicali

  • La proprietà TreeView.NodeLeadingChanged, disponibile solo in anteprima, l'evento TreeView.OnNodeLeadingChanged(EventArgs) e il metodo protetto TreeView.NodeLeading sono stati rimossi. Le app compilate in base a .NET 11 anteprime devono rimuovere gli usi di queste API prima di passare a RC 1 e usare TreeView.ItemHeight quando è necessaria un'altezza esplicita del nodo.

  • PictureBox I callback dei frame animati ora si interrompono quando il controllo non dispone di handle della finestra, prima di InvokeRequiredessere valutati. In questo modo si evitano errori intermittenti nella creazione degli handle durante la tempistica dei callback dell'animazione e si limita la modifica del ciclo di vita dei callback a tale finestra temporale.

Correzioni dei bug

  • Control: la SendKeys regressione del modificatore immediato sequenziale ( ad esempio ^a^c, +a+c, %f%t) è fissa. Il KeyboardToolTipStateMachine non genera più KeyNotFoundException quando il focus cambia durante la visualizzazione di un tooltip.

  • ListBox: IsSynchronized i valori sono ora corretti tra le ListBox raccolte.

  • NumericUpDown: È stata corretta la regressione del rendering del pulsante che si verificava quando gli stili visuali sono disattivati.

  • SplitContainer: il controllo gestisce ora un GDI+ ExternalException temporaneo durante la transizione della sessione di visualizzazione durante la chiamata a RepaintSplitterRect.

  • ToolStrip: il pulsante di scorrimento verso il basso non viene più generato durante lo scorrimento. Le icone in stato indeterminato e selezionate ToolStripMenuItem sono ora visibili in modalità scura.

  • PropertyGrid: l'icona del pulsante della pagina Proprietà non cambia più quando LargeButtons viene attivato ad alti valori DPI. ResetHelpForeColor reimposta ora correttamente il colore di primo piano anziché il colore di sfondo.

  • PrintPreviewControl: ForeColor il rendering è ora corretto quando è impostato su Bianco.

  • Modalità scura

    • LinkLabel il contrasto in modalità scura è migliorato. TabControl annidato in SplitContainer ora corrisponde alla modalità scura. HelpProvider il testo è ora visibile in modalità scura. ToolTip ora passa alla modalità scura quando SystemColorMode.Dark è impostata.

    • Le finestre ora mantengono la barra del titolo scura quando una modifica della disposizione da destra a sinistra ricrea l'handle e le descrizioni comandi ErrorProvider e le descrizioni comandi al passaggio del mouse TreeView/ListView vengono visualizzate con colori scuri.

  • Appunti: la conversione automatica dei formati degli Appunti viene ripristinata per le letture, inclusa la conversione di testo Unicode corretta.

  • Controlli: i controlli multiriga TextBox da destra a sinistra visualizzano correttamente la barra di scorrimento verticale, TaskDialog gestiscono gli ID di pulsante imprevisti senza sollevare eccezioni e i valori PrintDocument vuoti mostrano ora un'anteprima vuota anziché una pagina nera.

  • Disegno e DPI elevato: ControlPaint.Light l'interpolazione per i colori di sistema viene corretta e PropertyGrid la scalabilità delle icone è fissa su una visualizzazione secondaria di 100%.