Nouveautés de Windows Forms pour .NET 7
Cet article décrit certaines des nouvelles fonctionnalités et améliorations de Windows Forms dans .NET 7.
Vous devez connaître quelques changements cassants lors de la migration de .NET Framework vers .NET 7. Pour plus d’informations, consultez Changements cassants dans Windows Forms.
Améliorations élevées des ppp
Le rendu DPI élevé avec PerMonitorV2 a été amélioré :
Mettez à l’échelle correctement les contrôles imbriqués. Par exemple, un bouton qui se trouve dans un panneau, qui est placé sur une page d’onglets.
Mettez à l’échelle Form.MaximumSize et Form.MinimumSize les propriétés en fonction des paramètres DPI de moniteur actuels pour les applications qui s’exécutent
ApplicationHighDpiMode
surPerMonitorV2
.Dans .NET 7, cette fonctionnalité est désactivée par défaut et vous devez choisir de recevoir cette modification. À compter de .NET 8, cette fonctionnalité est activée par défaut et vous devez la désactiver pour revenir au comportement précédent.
Pour activer la fonctionnalité, définissez le
configProperties
paramètre dans runtimeconfig.json :{ "runtimeOptions": { "tfm": "net7.0", "frameworks": [ ... ], "configProperties": { "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": true, } } }
Améliorations et correctifs d’accessibilité
Cette version ajoute d’autres améliorations à l’accessibilité, y compris, mais pas seulement aux éléments suivants :
De nombreux problèmes liés à l’annonce observés dans les lecteurs d’écran ont été résolus, ce qui garantit que les informations sur les contrôles sont correctes. Par exemple, ListView annonce correctement lorsqu’un groupe est développé ou réduit.
D’autres contrôles fournissent désormais la prise en charge d’UI Automation :
Des fuites de mémoire liées à l’exécution d’une application Windows Forms sous des outils d’assistance, tels que le Narrateur, ont été corrigées.
Les outils d’assistance dessinent désormais avec précision les indicateurs de focus et signalent des rectangles englobants corrects pour les formulaires imbriqués et certains éléments de contrôles composites, tels que DataGridView, ListViewet TabControl.
Le modèle de contrôle ExpandCollapse de l’interface utilisateur Automation a été correctement implémenté dans ListView, TreeViewet les contrôles, et PropertyGrid s’active uniquement pour les éléments extensibles.
Corrections de différents ratios de contraste de couleur dans les contrôles.
Améliorations de visibilité pour ToolStripTextBox et ToolStripButton dans les thèmes à contraste élevé.
Améliorations de la liaison de données (préversion)
Bien que Windows Forms ait déjà un moteur de liaison puissant, une forme plus moderne de liaison de données, similaire à la liaison de données fournie par WPF, est introduite.
Les nouvelles fonctionnalités de liaison de données vous permettent d’adopter entièrement le modèle MVVM et l’utilisation de mappeurs relationnels objet à partir de ViewModels dans Windows Forms plus facile qu’auparavant. Cela, à son tour, permet de réduire le code dans les fichiers code-behind et ouvre de nouvelles possibilités de test. Plus important encore, il permet le partage de code entre Windows Forms et d’autres frameworks gui .NET tels que WPF, UWP/WinUI et .NET MAUI. Et pour clarifier une question fréquemment posée, il n’existe aucun plan pour introduire XAML dans Windows Forms.
Ces nouvelles fonctionnalités de liaison de données sont en préversion pour .NET 7, et d’autres travaux sur cette fonctionnalité se produisent dans .NET 8.
Pour activer la nouvelle liaison, ajoutez le EnablePreviewFeatures
paramètre à votre fichier projet. Ceci est pris en charge dans C# et Visual Basic.
<Project Sdk="Microsoft.NET.Sdk">
<!-- other settings -->
<PropertyGroup>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
</Project>
L’extrait de code suivant illustre les nouvelles propriétés, événements et méthodes ajoutés aux différentes classes dans Windows Forms. Même si l’exemple de code suivant est en C#, il s’applique également à Visual Basic.
public class Control {
[BindableAttribute(true)]
public virtual object DataContext { get; set; }
[BrowsableAttribute(true)]
public event EventHandler DataContextChanged;
protected virtual void OnDataContextChanged(EventArgs e);
protected virtual void OnParentDataContextChanged(EventArgs e);
}
[RequiresPreviewFeaturesAttribute]
public abstract class BindableComponent : Component, IBindableComponent, IComponent, IDisposable {
protected BindableComponent();
public BindingContext? BindingContext { get; set; }
public ControlBindingsCollection DataBindings { get; }
public event EventHandler BindingContextChanged;
protected virtual void OnBindingContextChanged(EventArgs e);
}
public abstract class ButtonBase : Control {
[BindableAttribute(true)]
[RequiresPreviewFeaturesAttribute]
public ICommand? Command { get; set; }
[BindableAttribute(true)]
public object? CommandParameter { [RequiresPreviewFeaturesAttribute] get; [RequiresPreviewFeaturesAttribute] set; }
[RequiresPreviewFeaturesAttribute]
public event EventHandler? CommandCanExecuteChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler? CommandChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler? CommandParameterChanged;
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandCanExecuteChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandParameterChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnRequestCommandExecute(EventArgs e);
}
public abstract class ToolStripItem : BindableComponent, IComponent, IDisposable, IDropTarget {
[BindableAttribute(true)]
[RequiresPreviewFeaturesAttribute]
public ICommand Command { get; set; }
[BindableAttribute(true)]
public object CommandParameter { [RequiresPreviewFeaturesAttribute] get; [RequiresPreviewFeaturesAttribute] set; }
[RequiresPreviewFeaturesAttribute]
public event EventHandler CommandCanExecuteChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler CommandChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler CommandParameterChanged;
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandCanExecuteChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandParameterChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnRequestCommandExecute(EventArgs e);
}
Améliorations diverses
Voici d’autres changements notables :
- La gestion des glisser-déplacer correspond à la fonctionnalité de glisser-déplacer Windows avec des effets d’affichage plus riches tels que les icônes et les étiquettes de texte.
- Les boîtes de dialogue dossier et fichier permettent d’obtenir d’autres options :
- Ajouter à la version récente
- Vérifier l’accès en écriture
- Mode étendu
- OK nécessite une interaction
- Sélectionner en lecture seule
- Afficher les fichiers masqués
- Afficher les emplacements épinglés
- Afficher l’aperçu
- ErrorProvider a une HasErrors propriété maintenant.
- La disposition d’alignement du formulaire est fixe pour Windows 11.
Voir aussi
.NET Desktop feedback