Freigeben über


Neuerungen in WPF für .NET 9

In diesem Artikel wird beschrieben, was in Windows Presentation Foundation (WPF) für .NET 9 neu ist. Der Schwerpunkt von WPF in diesem Jahr war die Verbesserung der visuellen Funktionen von WPF und die Bereitstellung eines neuen Designs basierend auf den Fluent-Designprinzipien für Windows 11.

Sie können eine Vorschau des neuen Designs anzeigen, indem Sie die WPF-Katalog-App aus dem Microsoft Store herunterladen.

Fluent-Thema

Ein neues Design ist in WPF enthalten, das eine frische, moderne Windows 11-Ästhetik für WPF-Apps bietet. Es enthält integrierte helle und dunkle Themen sowie Unterstützung der Systemakzentfarbe.

  • Fluent-Design-Thema im Lichtmodus

    Screenshot der WPF-Katalog-App, die das Fluent-Theme im Hellmodus zeigt.

  • Fluent-Theme im dunklen Modus:

    Screenshot der WPF Gallery-App, die das fluent-Design im dunklen Modus veranschaulicht

Anwenden des Designs

Sie können das Fluent-Design auf zwei Arten anwenden, indem Sie die ThemeMode Eigenschaft festlegen oder auf das Fluent-Designressourcenwörterbuch verweisen. Weitere Informationen zur Einstellung des Designmodus finden Sie unter ThemeMode.

Das Fluent-Designressourcenverzeichnis ist im folgenden Paket-URI verfügbar: /PresentationFramework.Fluent;component/Themes/Fluent.xaml. Um die Ressource auf Anwendungsebene anzuwenden, laden Sie die Ressource in die Ressourcen Ihrer App:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/PresentationFramework.Fluent;component/Themes/Fluent.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Das Ressourcenverzeichnis kann auch auf ein Window angewendet werden, um nur das Fenster selbst zu thematisieren.

Themenmodus

WPF wurde eine neue Formatierungs-API hinzugefügt, die über die ThemeMode Eigenschaft verfügbar gemacht wird. Mithilfe dieser Eigenschaft können Sie die Fluent-Formatvorlage anwenden, ohne direkt auf ein Formatressourcenwörterbuch verweisen zu müssen.

Verfügbare Werte sind:

  • Light– Wendet das helle Fluent-Design an.
  • Dark– Wendet das dunkle Fluent-Design an.
  • System– Wendet das helle oder dunkle Fluent-Design basierend auf der aktuellen Windows-Einstellung des Benutzers an.
  • None—(Standard) Verwendet das Aero2-Design.

Wenn Sie einen Designmodus für die gesamte Anwendung anwenden möchten, legen Sie die ThemeMode Eigenschaft für den Application Typ fest. Um es auf ein einzelnes Fenster anzuwenden, legen Sie ThemeMode für den Typ Window fest.

Formatieren Sie beispielsweise die gesamte Anwendung basierend auf dem aktuellen hellen oder dunklen Design, das von Windows festgelegt wurde:

<Application x:Class="MyWpfProject.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:MyWpfProject"
             StartupUri="MainWindow.xaml"
             ThemeMode="System">

Hier sehen Sie ein Beispiel für das Erzwingen des hellen Designs, unabhängig vom Design, das von Windows festgelegt wurde:

<Window x:Class="MyWpfProject.LightWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MyWpfProject"
        Title="LightWindow" Height="450" Width="800"
        ThemeMode="Light">

Wenn der ThemeMode Wert auf einen anderen Wert als None auf Anwendungsebene festgelegt ist, None kann er nicht mehr auf Fensterebene angewendet werden.

ThemeMode ist so konzipiert, dass die von einem Fluent-Wörterbuch festgelegten Einstellungen berücksichtigt werden, sodass Sie das Fluent-Design anpassen können.

Im Code festlegen

Derzeit ist die Unterstützung für das Ändern der Einstellungen im ThemeMode Code ein experimentelles Feature. Der Zugriff auf die ThemeMode Eigenschaft im Code generiert Fehler WPF0001 und verhindert den Zugriff auf die API. Unterdrücken Sie den Fehler, um Zugriff auf die API zu erhalten.

Warnung

Diese API ist experimentell und kann geändert werden.

Fügen Sie zunächst das folgende PropertyGroup Element zur Projektdatei hinzu, um den Fehler zu unterdrücken:

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

Tipp

Sie können die #pragma warning disable WPF0001 Direktive verwenden, um den Fehler zu unterdrücken, in dem er auftritt, anstatt ihn für das gesamte Projekt zu deaktivieren.

Legen Sie als Nächstes entweder die ThemeMode Eigenschaft auf Anwendungsebene oder auf Fensterebene fest:

// Set light mode at the application-level
Application.Current.ThemeMode = ThemeMode.Light;

// Set dark mode on the current window
this.ThemeMode = ThemeMode.Dark;

Unterstützung für Windows-Akzentfarbe

Windows 10 hat eine vom Benutzer auswählbare Akzentfarbe eingeführt, die verwendet wird, um eine persönliche Toucheingabe bereitzustellen oder ein bestimmtes visuelles Element aufzurufen. WPF unterstützt jetzt die vom Benutzer ausgewählte Akzentfarbe.

Die Farbe ist als System.Windows.Media.Color, System.Windows.Media.SolidColorBrush oder System.Windows.ResourceKey verfügbar. Zusammen mit der Farbe selbst sind helle und dunkle Schattierungen der Akzentfarbe verfügbar. Der Zugriff erfolgt über System.Windows.SystemColors:

Farbe Farbressourcenschlüssel Bürste Pinselressourcenschlüssel
Akzent AccentColor AccentColorKey AccentColorBrush AccentColorBrushKey
Licht 1 AccentColorLight1 AccentColorLight1Key AccentColorLight1Brush AccentColorLight1BrushKey
Licht 2 AccentColorLight2 AccentColorLight2Key AccentColorLight2Brush AccentColorLight2BrushKey
Hell 3 AccentColorLight3 AccentColorLight3Key AccentColorLight3Brush AccentColorLight3BrushKey
Dunkel 1 AccentColorDark1 AccentColorDark1Key AccentColorDark1Brush AccentColorDark1BrushKey
Dunkel 2 AccentColorDark2 AccentColorDark2Key AccentColorDark2Brush AccentColorDark2BrushKey
Dunkel 3 AccentColorDark3 AccentColorDark3Key AccentColorDark3Brush AccentColorDark3BrushKey

Von Bedeutung

Akzentfarben sind mit oder ohne Fluent-Design verfügbar.

Wenn Sie eine Benutzeroberfläche erstellen, die die Akzentfarbe verwendet, umschließen Sie den Ressourcenschlüssel in eine dynamische Ressource. Wenn ein Benutzer die Akzentfarbe ändert, während die App geöffnet wird, wird die Farbe automatisch in der App aktualisiert. Hier ist beispielsweise ein TextBlock, dessen Vordergrundfarbe auf die vom Benutzer gewählte Akzentfarbe festgelegt ist.

<TextBlock Text="First Name:"
           Foreground="{DynamicResource {x:Static SystemColors.AccentColorBrushKey}}" />

Unterstützung für bindestrichbasierte Ligaturen

WPF unterstützt nie Bindestrich-basierte Ligaturen in UI-Steuerelementen wie der TextBlock. Diese langjährige Community-Anfrage wurde in .NET 9 hinzugefügt.

Hier ist ein Bild der Ligaturen, die nicht auf die Glyphen in .NET 8 angewendet werden:

Screenshot einer einfachen WPF-App mit einem Textblock, der zeigt, wie Glyphen nicht in Ligaturen mit .NET 8 kombiniert werden.

Und jetzt, derselbe Text wie in .NET 9 gerendert:

Screenshot einer einfachen WPF-App mit einem Textblock, der zeigt, wie Glyphen in Ligaturen mit .NET 9 kombiniert werden.

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.

WPF verwendete BinaryFormatter in vielen Szenarien, z. B. beim Serialisieren von Daten für Zwischenablage- und Drag-and-Drop-Vorgänge. Intern verwendet WPF weiterhin eine sicherere Teilmenge, BinaryFormatter um bestimmte Anwendungsfälle mit einem bekannten Satz von Typen zu behandeln.

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