Condividi tramite


Novità di Windows Form per .NET 9

Questo articolo descrive le novità di Windows Form per .NET 9.

Moduli asincroni

Importante

Questo set di funzionalità è sperimentale, ad eccezione di Control.InvokeAsync.

Le app moderne richiedono modelli di comunicazione asincroni. Man mano che Windows Form è cresciuto in .NET, più componenti richiedono il marshalling a un async metodo per l'esecuzione nel thread dell'interfaccia utente. Ad esempio, controlli come WebView2, API native di Windows 10 e Windows 11 o librerie asincrone moderne come Semantic Kernel. Un altro scenario è la posizione in cui si condividono I modelli di visualizzazione MVVM creati async con Windows Form da altri stack di interfaccia utente, ad esempio WPF, WinUI o .NET MAUI.

Di seguito è riportato un elenco di nuovi metodi aggiunti per supportare scenari asincroni:

Questa API è protetta da un errore del compilatore perché è sperimentale. Per eliminare l'errore e abilitare l'accesso all'API, aggiungere quanto segue PropertyGroup al file di progetto:

<PropertyGroup>
    <NoWarn>$(NoWarn);WFO5002</NoWarn>
</PropertyGroup>

Suggerimento

Per altre informazioni su come eliminare questa regola, vedere Errore del compilatore WFO5002.

BinaryFormatter non più supportato

BinaryFormatter è considerato non sicuro perché è vulnerabile agli attacchi di deserializzazione, che possono causare denial of service (DoS), divulgazione di informazioni o esecuzione di codice remoto. È stato implementato prima della deserializzazione delle vulnerabilità ben comprensibili e la progettazione non segue le procedure consigliate per la sicurezza moderna.

A partire da .NET 9, l'implementazione è stata rimossa per evitare questi rischi per la sicurezza. Quando BinaryFormatter viene utilizzata, viene generata l'eccezione PlatformNotSupportedException .

Windows Form usati BinaryFormatter in molti scenari, ad esempio durante la serializzazione dei dati per gli Appunti e le operazioni di trascinamento della selezione e, soprattutto, Windows Form Designer. Internamente, Windows Form continua a usare un subset più sicuro di BinaryFormatter per gestire casi d'uso specifici con un set noto di tipi.

Windows Form per .NET 9 è disponibile con analizzatori che consentono di identificare i tempi di partecipazione inconsapevolmente alla serializzazione binaria.

Per altre informazioni su BinaryFormatter, vedere Windows Form guida alla migrazione per BinaryFormatter.

Modalità scura

Importante

Questo set di funzionalità è sperimentale.

Il supporto preliminare per la modalità scura è stato aggiunto a Windows Form, con l'obiettivo di finalizzare il supporto in .NET 10. Quando la modalità colore cambia, l'oggetto SystemColors viene modificato in modo che corrisponda. La modalità colore per l'app può essere impostata su uno dei valori seguenti:

  • SystemColorMode.Classic—(impostazione predefinita) Modalità light, uguale a quella delle versioni precedenti di Windows Form.
  • SystemColorMode.System— Rispettare la modalità chiara o scura impostata da Windows.
  • SystemColorMode.Dark- Usa la modalità scura.

Per applicare una modalità colore, chiamare Application.SetColorMode(SystemColorMode) nel codice di avvio del programma:

namespace MyExampleProject;

static class Program
{
    /// <summary>
    ///  The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        // To customize application configuration such as set high DPI settings or default font,
        // see https://aka.ms/applicationconfiguration.
        ApplicationConfiguration.Initialize();
        Application.SetColorMode(SystemColorMode.Dark);
        Application.Run(new Form1());
    }    
}
Friend Module Program

    <STAThread()>
    Friend Sub Main(args As String())
        Application.SetHighDpiMode(HighDpiMode.SystemAware)
        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)
        Application.SetColorMode(SystemColorMode.Dark)
        Application.Run(New Form1)
    End Sub

End Module

Questa API è protetta da un errore del compilatore perché è sperimentale. Per eliminare l'errore e abilitare l'accesso all'API, aggiungere quanto segue PropertyGroup al file di progetto:

<PropertyGroup>
    <NoWarn>$(NoWarn);WFO5001</NoWarn>
</PropertyGroup>

Suggerimento

Per altre informazioni su come eliminare questa regola, vedere Errore del compilatore WFO5001.

Miglioramenti di FolderBrowserDialog

FolderBrowserDialog supporta ora la selezione di più cartelle, archiviate nella SelectedPaths matrice. Per abilitare più cartelle, impostare su Multiselecttrue.

Funzionalità e miglioramenti di System.Drawing

La libreria System.Drawing ha apportato numerosi miglioramenti, tra cui il wrapping degli effetti GDI+, il supporto per ReadOnlySpane una migliore generazione di codice di interoperabilità.

System.Drawing supporta effetti GDI+

La libreria System.Drawing supporta ora effetti bitmap GDI+, ad esempio sfocatura e tinta. Gli effetti sono stati parte di GDI+, ma non sono stati esposti tramite System.Drawing fino ad ora.

Gli effetti vengono applicati a un Bitmap oggetto chiamando il Bitmap.ApplyEffect(Effect, Rectangle) metodo . Fornire l'effetto e un facoltativo Rectangle per l'area su cui applicare l'effetto. Usare Rectangle.Empty per elaborare l'intera immagine.

Lo System.Drawing.Imaging.Effects spazio dei nomi contiene gli effetti che è possibile applicare:

System.Drawing supporta Span

Molti metodi che accettano matrici sono stati migliorati per accettare ReadOnlySpananche . Ad esempio, metodi come GraphicsPath.AddLines(ReadOnlySpan<Point>), Graphics.DrawLines(Pen, ReadOnlySpan<Point>)e DrawPolygon(Pen, ReadOnlySpan<Point>), accettano una matrice o ReadOnlySpan.

Usare CsWin32 per l'interoperabilità

Tutto il codice di interoperabilità è stato sostituito da CsWin32, un generatore di origine P/Invoke C#.

ToolStrip

Sono stati aggiunti i miglioramenti seguenti ai ToolStrip controlli e ToolStripItem .

  • È stata aggiunta una nuova proprietà a ToolStrip, AllowClickThrough.

    Se impostato su true, il controllo può essere interagito con mentre la maschera è non messa a fuoco.

Quando è stato rilasciato .NET Core 3.1, tutti i Menucontrolli correlati, ad esempio MainMenu e MenuItem, sono stati rimossi. ToolStrip e ToolStripMenuItem deve essere invece usato. Tuttavia, ToolStripItemla classe di base per ToolStripMenuItem, non ha avuto una sostituzione per l'evento MenuItem.Select . Questo evento è stato generato quando viene utilizzato il mouse o la tastiera per evidenziare l'elemento.

.NET 9 ha aggiunto ToolStripItem.SelectedChanged, che può essere usato per rilevare quando viene evidenziata una voce di menu.