Neuerungen in .NET 8 (Windows Forms .NET)

In diesem Artikel werden einige der neuen Windows Forms-Features und -Verbesserungen in .NET 8 beschrieben.

Es gibt einige Breaking Changes, die bei der Migration von .NET Framework zu .NET 8 berücksichtigt werden müssen. Weitere Informationen finden Sie unter Breaking Changes in Windows Forms.

Verbesserungen bei der Datenbindung

Eine neue Datenbindungs-Engine befand sich in .NET 7 in der Vorschauphase und ist in .NET 8 jetzt vollständig aktiviert. Die neue Engine ist zwar nicht so umfangreich wie die bereits vorhandene Datenbindungs-Engine von Windows Forms, WPF wurde jedoch als Vorlage herangezogen, was die Implementierung von MVVM-Entwurfsprinzipien erleichtert.

Die verbesserten Datenbindungsfunktionen vereinfachen die vollständige Nutzung des MVVM-Musters und verwenden objektrelationale Mapper aus Ansichtsmodellen (ViewModels) in Windows Forms. Dadurch wird der Code in CodeBehind-Dateien reduziert. Zudem wird so die gemeinsame Verwendung von Code durch Windows Forms und andere .NET-GUI-Frameworks wie WPF, UWP/WinUI und .NET MAUI ermöglicht. Wichtig: Die erwähnten GUI-Frameworks nutzen zwar XAML als Benutzeroberflächentechnologie, XAML wird jedoch nicht in Windows Forms eingeführt.

Die IBindableComponent-Schnittstelle und die BindableComponent-Klasse steuern das neue Bindungssystem. Control implementiert die Schnittstelle und stellt neue Datenbindungsfunktionen für Windows Forms bereit.

Schaltflächenbefehle

Schaltflächenbefehle befanden sich in .NET 7 in der Vorschauphase und sind jetzt vollständig in .NET 8 aktiviert. Ähnlich wie bei WPF kann die Instanz eines Objekts, das die ICommand-Schnittstelle implementiert, der Command-Eigenschaft der Schaltfläche zugewiesen werden. Wenn auf die Schaltfläche geklickt wird, wird der Befehl aufgerufen.

Ein optionaler Parameter kann angegeben werden, wenn der Befehl aufgerufen wird, indem ein Wert für die CommandParameter-Eigenschaft der Schaltfläche angegeben wird.

Die Eigenschaften Command und CommandParameter werden im Designer über das Fenster Eigenschaften unter (DataBindings) festgelegt, wie in der folgenden Abbildung zu sehen.

The Visual Studio properties window highlighting a Windows Forms' Button's Command and CommandParameter properties.

Schaltflächen lauschen auch auf das ICommand.CanExecuteChanged-Ereignis, was bewirkt, dass das Steuerelement die ICommand.CanExecute-Methode abfragt. Wenn diese Methode true zurückgibt, ist das Steuerelement aktiviert. Bei Rückgabe von false ist es deaktiviert.

DPI-Verbesserungen in Visual Studio

Visual Studio 2022 17.8 führt Designerregisterkarten ohne DPI-Unterstützung ein. Zuvor wurde die Registerkarte „Windows-Designer“ in Visual Studio mit dem DPI-Wert von Visual Studio ausgeführt. Dies führt zu Problemen, wenn Sie eine Windows Forms-App ohne DPI-Unterstützung entwerfen. Nun können Sie sicherstellen, dass der Designer mit der gleichen gewünschten Skalierung ausgeführt wird wie die App (unabhängig von der DPI-Unterstützung). Vor Einführung dieses Features musste Visual Studio im Modus ohne DPI-Unterstützung ausgeführt werden, wodurch Visual Studio bei angewendeter Skalierung in Windows verschwommen dargestellt wurde. Jetzt sind keine Maßnahmen mehr für Visual Studio erforderlich, und der Designer kann ohne DPI-Unterstützung ausgeführt werden.

Sie können den Designer ohne DPI-Unterstützung für das Windows Forms-Projekt aktivieren, indem Sie der Projektdatei <ForceDesignerDPIUnaware> hinzufügen und den Wert auf true festlegen.

<PropertyGroup>
  <OutputType>WinExe</OutputType>
  <TargetFramework>net8.0-windows</TargetFramework>
  <Nullable>enable</Nullable>
  <UseWindowsForms>true</UseWindowsForms>
  <ImplicitUsings>enable</ImplicitUsings>
  <ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
  <ApplicationHighDpiMode>DpiUnawareGdiScaled</ApplicationHighDpiMode>
</PropertyGroup>

Wichtig

Visual Studio liest diese Einstellung, wenn das Projekt geladen wird, aber nicht, wenn es geändert wird. Nachdem Sie diese Einstellung geändert haben, müssen Sie Ihr Projekt entladen und erneut laden, damit die Einstellung von Visual Studio berücksichtigt wird.

Verbesserungen bei hohen DPI-Werten

Das Rendering bei hohen DPI-Werten mit PerMonitorV2 wurde verbessert:

  • Ordnungsgemäße Skalierung geschachtelter Steuerelemente. Beispielsweise eine Schaltfläche, die sich in einem Bereich befindet, der auf einer Registerkartenseite platziert wird.

  • Skalieren Sie die Eigenschaften Form.MaximumSize und Form.MinimumSize basierend auf den aktuellen DPI-Einstellungen für Monitore.

    Ab .NET 8 ist dieses Feature standardmäßig aktiviert, und Sie müssen es deaktivieren, um zum vorherigen Verhalten zurückzukehren.

    Wenn Sie das Feature deaktivieren möchten, fügen Sie System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi der Einstellung configProperties in runtimeconfig.json hinzu, und legen Sie den Wert auf „false“ fest:

    {
      "runtimeOptions": {
        "tfm": "net8.0",
        "frameworks": [
            ...
        ],
        "configProperties": {
          "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": false,
        }
      }
    }
    

Sonstige Verbesserungen

Hier sind einige weitere wichtige Änderungen:

  • Der Code zur Behandlung von FolderBrowserDialog wurde verbessert, um einige Fälle von Arbeitsspeicherverlust zu beheben.
  • In der Codebasis für Windows Forms wurde nach und nach die NULL-Zulässigkeit für C# aktiviert, um potenzielle NULL-Verweisfehler zu beseitigen.
  • Der System.Drawing-Quellcode wurde zum GitHub-Repository von Windows Forms migriert.
  • Auf moderne Windows-Symbole kann über eine neue API zugegriffen werden: System.Drawing.SystemIcons.GetStockIcon. Die System.Drawing.StockIconId-Aufzählung listet alle verfügbaren Systemsymbole auf.
  • Weitere Designer sind jetzt zur Laufzeit verfügbar. Weitere Informationen finden Sie im GitHub-Issue 4908.