Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo offre una panoramica generale delle novità di Windows Forms (WinForms) in .NET 11 Preview. 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 Preview 7 è stato rilasciato nell'agosto 2026.
Annunci di rilascio
Ogni annuncio di versione fornisce informazioni dettagliate sulle modifiche Windows Forms per .NET 11:
- .NET 11 Preview 7
- .NET 11 Preview 6
- .NET 11 Preview 5
- .NET 11 Preview 4
- .NET 11 Preview 3
- .NET 11 Preview 2
- .NET 11 Preview 1
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);
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. In base ai test esplorativi e ai feedback dei clienti, i controlli che usano impostazioni di stile visivo non classico potrebbero occupare più o meno spazio nelle prossime versioni .NET 11 (RC, GA) rispetto a quanto fatto nell'anteprima 7. 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
IDataObjectche 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 aTryGetData<Image>(DataFormats.Bitmap, autoConvert: true, ...), e restituiscenullse 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=truenon 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
-
AnchorLayoutV2ora 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
- PropertyGrid.SelectedTab ora viene aggiornato correttamente quando PropertyGrid.SelectedObject viene assegnato.
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.
Correzioni dei bug
Control: la SendKeys regressione del modificatore immediato sequenziale ( ad esempio
^a^c,+a+c,%f%t) è fissa. IlKeyboardToolTipStateMachinenon genera piùKeyNotFoundExceptionquando il focus cambia durante la visualizzazione di un tooltip.ListBox:
IsSynchronizedi valori sono ora corretti tra leListBoxraccolte.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+
ExternalExceptiontemporaneo durante la transizione della sessione di visualizzazione durante la chiamata aRepaintSplitterRect.ToolStrip: il pulsante di scorrimento verso il basso non viene più generato durante lo scorrimento. Le icone in stato indeterminato e selezionate
ToolStripMenuItemsono ora visibili in modalità scura.PropertyGrid: l'icona del pulsante della pagina Proprietà non cambia più quando
LargeButtonsviene attivato ad alti valori DPI.ResetHelpForeColorreimposta ora correttamente il colore di primo piano anziché il colore di sfondo.PrintPreviewControl:
ForeColoril rendering è ora corretto quando è impostato su Bianco.Modalità scura:
LinkLabelil contrasto in modalità scura è migliorato.TabControlannidato inSplitContainerora corrisponde alla modalità scura.HelpProvideril testo è ora visibile in modalità scura.ToolTipora passa alla modalità scura quandoSystemColorMode.Darkè impostata.
.NET Desktop feedback