Lire en anglais

Partager via


Nouveautés de WPF pour .NET 9

Cet article décrit les nouveautés de Windows Presentation Foundation (WPF) pour .NET 9. Le principal domaine d’intérêt pour WPF cette année a été d’améliorer les fonctionnalités visuelles de WPF et de fournir un nouveau thème basé sur les principes de conception Fluent pour Windows 11.

Vous pouvez afficher un aperçu du nouveau thème en téléchargeant l’application galerie WPF à partir du Microsoft Store.

Thème Fluent

Un nouveau thème est inclus avec WPF qui offre une esthétique Windows 11 fraîche et moderne pour les applications WPF. Il inclut des modes clair et foncé intégrés, ainsi qu’une prise en charge des couleurs d’accentuation système.

  • Thème Fluent en mode clair :

    Capture d’écran de l’application galerie WPF, montrant le thème Fluent en mode clair.

  • Thème Fluent en mode sombre :

    Capture d’écran de l’application galerie WPF, montrant le thème Fluent en mode sombre

Appliquer le thème

Vous pouvez appliquer le thème Fluent de deux façons, définir la ThemeMode propriété ou référencer le dictionnaire de ressources de thème Fluent. Pour plus d’informations sur le paramètre de mode thème, consultez ThemeMode.

Le dictionnaire de ressources de thème Fluent est disponible dans l’URI de pack suivant : /PresentationFramework.Fluent;component/Themes/Fluent.xaml. Pour appliquer la ressource au niveau de l’application, chargez la ressource dans les ressources de votre application :

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

Le dictionnaire de ressources peut également être appliqué à un Window thème uniquement la fenêtre elle-même.

ThemeMode

Une nouvelle API de style a été ajoutée à WPF, qui est exposée via la ThemeMode propriété. À l’aide de cette propriété, vous pouvez appliquer le style Fluent sans avoir à référencer directement un dictionnaire de ressources de style.

Les valeurs disponibles sont les suivantes :

  • Light— Applique le thème Fluent clair.
  • Dark— Applique le thème Fluent foncé.
  • System— Applique le thème Fluent clair ou sombre, en fonction du paramètre Windows actuel de l’utilisateur.
  • None—(valeur par défaut) Utilise le thème Aero2.

Pour appliquer un mode thème pour l’ensemble de l’application, définissez la ThemeMode propriété sur le Application type. Pour l’appliquer à une seule fenêtre, définissez-la ThemeMode sur le Window type.

Par exemple, stylez l’ensemble de l’application en fonction du thème clair ou foncé actuel défini par Windows :

C#
<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">

Voici un exemple de forcer le thème clair, quel que soit le thème défini par Windows :

C#
<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">

Si la ThemeMode valeur est définie sur une valeur autre qu’au None niveau de l’application, None elle ne peut plus être appliquée au niveau de la fenêtre.

ThemeMode est conçu pour respecter les paramètres définis par un dictionnaire Fluent, ce qui vous permet de personnaliser le thème Fluent.

Définir dans le code

La prise en charge de la modification du paramètre dans le ThemeMode code est actuellement une fonctionnalité expérimentale. L’accès à la propriété dans le ThemeMode code génère une erreur WPF0001, empêchant l’accès à l’API. Supprimez l’erreur d’accès à l’API.

Avertissement

Cette API est expérimentale et susceptible de changer.

Tout d’abord, ajoutez l’élément suivant PropertyGroup à votre fichier projet pour supprimer l’erreur :

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

Conseil

Vous pouvez utiliser la #pragma warning disable WPF0001 directive pour supprimer l’erreur où elle se produit au lieu de la désactiver pour l’ensemble du projet.

Ensuite, définissez la ThemeMode propriété au niveau de l’application ou de la fenêtre :

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

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

Prise en charge de la couleur d’accentuation Windows

Windows 10 a introduit une couleur d’accentuation sélectionnable par l’utilisateur utilisée pour fournir une touche personnelle ou appeler un élément visuel spécifique. WPF prend désormais en charge la couleur d’accentuation sélectionnée par l’utilisateur.

La couleur visuelle est disponible en tant que System.Windows.Media.Color, System.Windows.Media.SolidColorBrushou System.Windows.ResourceKey. Outre la couleur elle-même, les nuances claires et sombres de la couleur d’accentuation sont disponibles. Ceux-ci sont accessibles via System.Windows.SystemColors:

Couleur Clé de ressource colori Brush Clé de ressource de pinceau
Accent AccentColor AccentColorKey AccentColorBrush AccentColorBrushKey
Lumière 1 AccentColorLight1 AccentColorLight1Key AccentColorLight1Brush AccentColorLight1BrushKey
Lumière 2 AccentColorLight2 AccentColorLight2Key AccentColorLight2Brush AccentColorLight2BrushKey
Lumière 3 AccentColorLight3 AccentColorLight3Key AccentColorLight3Brush AccentColorLight3BrushKey
Sombre 1 AccentColorDark1 AccentColorDark1Key AccentColorDark1Brush AccentColorDark1BrushKey
Sombre 2 AccentColorDark2 AccentColorDark2Key AccentColorDark2Brush AccentColorDark2BrushKey
Sombre 3 AccentColorDark3 AccentColorDark3Key AccentColorDark3Brush AccentColorDark3BrushKey

Important

Les couleurs d’accentuation sont disponibles avec ou sans le thème Fluent.

Lors de la création d’une interface utilisateur qui utilise la couleur d’accentuation, habillage de la clé de ressource dans une ressource dynamique. Lorsqu’un utilisateur modifie la couleur d’accentuation pendant l’ouverture de l’application, la couleur est mise à jour automatiquement dans l’application. Par exemple, voici une TextBlock couleur de premier plan définie sur la couleur d’accentuation choisie par l’utilisateur :

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

Prise en charge de ligature basée sur des traits d’union

WPF n’a jamais pris en charge les ligatures basées sur des traits d’union dans les contrôles d’interface utilisateur tels que le TextBlock. Cette demande de communauté de longue date a été ajoutée dans .NET 9.

Voici une image des ligatures qui ne sont pas appliquées aux glyphes dans .NET 8 :

Capture d’écran d’une application WPF simple qui a un bloc de texte montrant comment les glyphes ne sont pas combinés en ligatures avec .NET 8.

Et maintenant, ce même texte que affiché dans .NET 9 :

Capture d’écran d’une application WPF simple qui a un bloc de texte montrant comment les glyphes sont combinés en ligatures avec .NET 9.

BinaryFormatter n’est plus pris en charge

BinaryFormatter est considéré comme dangereux, car il est vulnérable aux attaques de désérialisation, ce qui peut entraîner un déni de service (DoS), une divulgation d’informations ou une exécution de code à distance. Elle a été implémentée avant que les vulnérabilités de désérialisation aient été bien comprises et sa conception ne respecte pas les meilleures pratiques de sécurité modernes.

À compter de .NET 9, son implémentation a été supprimée pour éviter ces risques de sécurité. Quand BinaryFormatter elle est utilisée, l’exception PlatformNotSupportedException est levée.

WPF utilisé BinaryFormatter dans de nombreux scénarios, par exemple lors de la sérialisation des données pour les opérations de presse-papiers et de glisser-déplacer. En interne, WPF continue d’utiliser un sous-ensemble plus sûr de BinaryFormatter gérer des cas d’usage spécifiques avec un ensemble connu de types.

Pour plus d’informations sur BinaryFormatter, consultez le guide de migration WPF pour BinaryFormatter.