Freigeben über


Neuerungen in Windows Forms für .NET 9

In diesem Artikel wird beschrieben, was in Windows Forms für .NET 9 neu ist.

Asynchrone Formulare

Von Bedeutung

Dieser Featuresatz ist experimentell, mit Ausnahme von Control.InvokeAsync.

Moderne Apps erfordern asynchrone Kommunikationsmodelle. Da Windows Forms auf .NET aufbaut, müssen mehr Komponenten für eine async-Methode gemarshalt werden, um auf dem UI-Thread ausgeführt zu werden. Steuerelemente wie WebView2, systemeigene Windows 10- und Windows 11-APIs oder moderne asynchrone Bibliotheken wie Semantic Kernel. Ein weiteres Szenario wäre, dass Sie MVVM ViewModels freigeben, die um async aufgebaut sind und mit Windows Forms von anderen UI-Stacks wie WPF, WinUI oder .NET MAUI verwendet werden.

Die folgende Liste der neuen Methoden, die zur Unterstützung asynchroner Szenarien hinzugefügt wurden:

Diese API wird hinter einem Compilerfehler geschützt, da sie experimentell ist. Um den Fehler zu unterdrücken und den Zugriff auf die API zu aktivieren, fügen Sie Der Projektdatei Folgendes PropertyGroup hinzu:

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

Tipp

Weitere Informationen zum Unterdrücken dieser Regel finden Sie unter Compilerfehler WFO5002.

BinaryFormatter wird nicht mehr unterstützt

BinaryFormatter wird als unsicher angesehen, da sie anfällig für Deserialisierungsangriffe ist, was zu Denial of Service (DoS), zur Offenlegung von Informationen oder zur Remotecodeausführung führen kann. Es wurde implementiert, bevor Deserialisierungsrisiken gut verstanden wurden, und sein Entwurf folgt nicht den bewährten Methoden für moderne Sicherheit.

Ab .NET 9 wurde die Implementierung entfernt, um diese Sicherheitsrisiken zu verhindern. Wenn BinaryFormatter verwendet wird, wird die PlatformNotSupportedException Ausnahme ausgelöst.

Windows Forms verwendete BinaryFormatter in vielen Szenarien, z. B. bei der Serialisierung von Daten für die Zwischenablage und Drag-and-Drop-Vorgänge, und vor allem im Windows Forms-Designer. Intern verwendet Windows Forms weiterhin eine sicherere Teilmenge, BinaryFormatter um bestimmte Anwendungsfälle mit einem bekannten Satz von Typen zu behandeln.

Windows Forms für .NET 9 wird mit Analysetools ausgeliefert, die Ihnen helfen, Zeiten zu identifizieren, in denen Sie unwissentlich an der binären Serialisierung teilnehmen.

Weitere Informationen BinaryFormatterfinden Sie im Windows Forms-Migrationshandbuch für BinaryFormatter.

Dunkler Modus

Von Bedeutung

Dieser Featuresatz ist experimentell.

Die vorläufige Unterstützung für den dunklen Modus wurde Windows Forms hinzugefügt, mit dem Ziel, den Support in .NET 10 abzuschließen. Wenn sich der Farbmodus ändert, werden die SystemColors entsprechend geändert. Der Farbmodus für die App kann auf einen der folgenden Werte festgelegt werden:

  • SystemColorMode.Classic—(Standard) Light-Modus, identisch mit früheren Versionen von Windows Forms.
  • SystemColorMode.System– Achten Sie auf den von Windows festgelegten hellen oder dunklen Modus.
  • SystemColorMode.Dark– Verwenden Sie den dunklen Modus.

Um einen Farbmodus anzuwenden, rufen Sie Application.SetColorMode(SystemColorMode) im Programmstartcode auf.

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

Diese API wird hinter einem Compilerfehler geschützt, da sie experimentell ist. Um den Fehler zu unterdrücken und den Zugriff auf die API zu aktivieren, fügen Sie Der Projektdatei Folgendes PropertyGroup hinzu:

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

Tipp

Weitere Informationen zum Unterdrücken dieser Regel finden Sie unter Compilerfehler WFO5001.

Die Verbesserungen des FolderBrowserDialogs

FolderBrowserDialog unterstützt jetzt die Auswahl mehrerer Ordner, die im SelectedPaths Array gespeichert sind. Um mehrere Ordner zu aktivieren, legen Sie diese Multiselect Einstellung auf true.

Neue Funktionen und Verbesserungen in System.Drawing

Die Bibliothek "System.Drawing " verfügt über viele Verbesserungen, darunter das Umschließen von GDI+-Effekten, die Unterstützung für ReadOnlySpanund eine bessere Interopcodegenerierung.

System.Drawing unterstützt GDI+-Effekte

Die System.Drawing-Bibliothek unterstützt jetzt GDI+-Bitmap-Effekte, z. B. Unschärfe und Farbton. Effekte sind Teil von GDI+, wurden aber bisher nicht über "System.Drawing " verfügbar gemacht.

Effekte werden auf eine Bitmap angewendet, indem die Bitmap.ApplyEffect(Effect, Rectangle) Methode aufgerufen wird. Geben Sie den Effekt und ein optionales Rectangle für den Bereich an, auf den der Effekt angewendet werden soll. Verwenden Sie Rectangle.Empty, um das gesamte Bild zu verarbeiten.

Der System.Drawing.Imaging.Effects Namespace enthält die Effekte, die Sie anwenden können:

System.Drawing unterstützt Span

Viele Methoden, die Arrays akzeptierten, wurden erweitert, um auch ReadOnlySpan zu akzeptieren. Beispielsweise akzeptieren Methoden wie GraphicsPath.AddLines(ReadOnlySpan<Point>), Graphics.DrawLines(Pen, ReadOnlySpan<Point>) und DrawPolygon(Pen, ReadOnlySpan<Point>) ein Array oder ReadOnlySpan.

Verwenden Sie CsWin32 für die Interoperabilität

Der gesamte Interopcode wurde durch CsWin32, einen C#P/Invoke-Quellgenerator, ersetzt.

ToolStrip

Die folgenden Verbesserungen wurden den ToolStrip- und ToolStripItem-Steuerelementen hinzugefügt.

  • Eine neue Eigenschaft wurde hinzugefügt zu ToolStrip, AllowClickThrough.

    Wenn auf true gesetzt, kann mit dem Steuerelement interagiert werden, während das Formular nicht fokussiert ist.

Als .NET Core 3.1 veröffentlicht wurde, wurden alle Menu-bezogenen Steuerelemente wie MainMenu und MenuItem entfernt. ToolStrip und ToolStripMenuItem sollte stattdessen verwendet werden. Jedoch hatte ToolStripItem, die Basisklasse für ToolStripMenuItem keinen Ersatz für das Ereignis MenuItem.Select. Dieses Ereignis wurde ausgelöst, wenn die Maus oder Tastatur verwendet wird, um das Element hervorzuheben.

.NET 9 hat ToolStripItem.SelectedChanged hinzugefügt, wodurch erkannt werden kann, wenn ein Menüelement hervorgehoben ist.