Partager via


Nouveautés de Windows Forms pour .NET 9

Cet article décrit les nouveautés de Windows Forms pour .NET 9.

Formulaires asynchrones

Important

Cet ensemble de fonctionnalités est expérimental, à l’exception de Control.InvokeAsync.

Les applications modernes nécessitent des modèles de communication asynchrones. À mesure que Windows Forms s'est développé sur .NET, d'autres composants nécessitent un transcodage vers une async méthode pour s'exécuter sur le thread de l'interface utilisateur. Par exemple, des contrôles tels que WebView2, des API Windows 10 et Windows 11 natives ou des bibliothèques asynchrones modernes telles que le noyau sémantique. Un autre scénario serait celui où vous partagez des ViewModels MVVM construits autour de async avec Windows Forms d'autres piles d'interface utilisateur telles que WPF, WinUI ou .NET MAUI.

Voici une liste de nouvelles méthodes ajoutées pour prendre en charge les scénarios asynchrones :

Cette API est protégée derrière une erreur du compilateur, car elle est expérimentale. Pour supprimer l’erreur et activer l’accès à l’API, ajoutez ce qui suit PropertyGroup à votre fichier projet :

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

Conseil / Astuce

Pour plus d’informations sur la suppression de cette règle, consultez Erreur du compilateur WFO5002.

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é. Lorsque BinaryFormatter est utilisé, l’exception PlatformNotSupportedException est levée.

Windows Forms utilise BinaryFormatter dans de nombreux scénarios, comme la sérialisation des données pour le Presse-papiers et les opérations de glisser-déposer, et surtout, le Concepteur Windows Forms. En interne, Windows Forms continue d’utiliser un sous-ensemble plus sûr de BinaryFormatter pour traiter des cas d’utilisation spécifiques avec un ensemble connu de types.

Windows Forms pour .NET 9 est fourni avec des analyseurs qui vous aident à identifier les occasions où vous participez involontairement à la sérialisation binaire.

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

Mode sombre

Important

Cet ensemble de fonctionnalités est expérimental.

La prise en charge préliminaire du mode sombre a été ajoutée à Windows Forms, avec l’objectif de finaliser la prise en charge dans .NET 10. Lorsque le mode de couleur change, les SystemColors sont modifiés pour correspondre. Le mode de couleur de l’application peut être défini sur l’une des valeurs suivantes :

  • SystemColorMode.Classic—(valeur par défaut) Mode clair, identique aux versions précédentes de Windows Forms.
  • SystemColorMode.System— Respectez le mode clair ou sombre défini par Windows.
  • SystemColorMode.Dark— Utiliser le mode sombre.

Pour appliquer un mode couleur, appelez Application.SetColorMode(SystemColorMode) le code de démarrage du programme :

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

Cette API est protégée derrière une erreur du compilateur, car elle est expérimentale. Pour supprimer l’erreur et activer l’accès à l’API, ajoutez ce qui suit PropertyGroup à votre fichier projet :

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

Conseil / Astuce

Pour plus d'informations sur la façon de supprimer cette règle, consultez Erreur du compilateur WFO5001.

Améliorations apportées à FolderBrowserDialog

FolderBrowserDialog prend désormais en charge la sélection de plusieurs dossiers, qui sont stockés dans le SelectedPaths tableau. Pour activer plusieurs dossiers, définissez Multiselect sur true.

Fonctionnalités et améliorations de System.Drawing

La bibliothèque System.Drawing a bénéficié de nombreuses améliorations, notamment l’intégration des effets GDI+, la prise en charge ReadOnlySpan, et une meilleure génération de code d’interopérabilité.

System.Drawing prend en charge les effets GDI+

La bibliothèque System.Drawing prend désormais en charge les effets bitmap GDI+, tels que le flou et la teinte. Les effets ont été une partie de GDI+, mais n’ont pas été exposés via System.Drawing jusqu’à présent.

Les effets sont appliqués à un Bitmap en appelant la Bitmap.ApplyEffect(Effect, Rectangle) méthode. Fournissez l'effet et un paramètre facultatif Rectangle pour la zone d'application de l'effet. Utilisez Rectangle.Empty pour traiter l'image entière.

L'espace de noms System.Drawing.Imaging.Effects contient les effets que vous pouvez appliquer.

System.Drawing prend en charge Span

De nombreuses méthodes qui acceptaient les tableaux ont été améliorées pour accepter également les ReadOnlySpan. Par exemple, des méthodes telles que GraphicsPath.AddLines(ReadOnlySpan<Point>), Graphics.DrawLines(Pen, ReadOnlySpan<Point>)et DrawPolygon(Pen, ReadOnlySpan<Point>), acceptent un tableau ou ReadOnlySpan.

Utiliser CsWin32 pour l’interopérabilité

Tout le code d’interopérabilité a été remplacé par CsWin32, un générateur source C# P/Invoke.

Barre d'outils

Les améliorations suivantes ont été ajoutées aux contrôles ToolStrip et ToolStripItem.

  • Une nouvelle propriété a été ajoutée à ToolStrip, AllowClickThrough.

    Lorsque la valeur est définie true, le contrôle peut être utilisé pendant que le formulaire n’a pas le focus.

À l'époque où .NET Core 3.1 est sorti, tous les Menu contrôles connexes, tels que MainMenu et MenuItem, ont été supprimés. ToolStrip et ToolStripMenuItem doit être utilisé à la place. Toutefois, ToolStripItemla classe de base pour ToolStripMenuItem, n’a pas été remplacée par l’événement MenuItem.Select . Cet événement a été déclenché lorsque la souris ou le clavier est utilisé pour mettre en surbrillance l’élément.

.NET 9 a ajouté ToolStripItem.SelectedChanged, qui peut être utilisé pour détecter lorsqu’un élément de menu est mis en surbrillance.