Partager via


Changements cassants dans Windows Forms pour .NET Core 3.0 et 3.1

La prise en charge de Windows Forms a été ajoutée à .NET Core dans la version 3.0. Cet article répertorie les modifications majeures pour Windows Forms selon la version .NET dans laquelle elles ont été introduites. Si vous mettez à niveau une application Windows Forms à partir de .NET Framework ou d’une version précédente de .NET Core (3.0 ou version ultérieure), cet article s’applique à vous.

Les changements majeurs suivants sont documentés sur cette page :

Modification avec rupture Version introduite
Contrôles supprimés 3.1
Événement CellFormatting non déclenché si l’info-bulle est affichée 3.1
Control.DefaultFont a été changé en Segoe UI 9 pt 3.0
Modernisation de FolderBrowserDialog 3.0
SerializableAttribute supprimé de certains types Windows Forms 3.0
Commutateur de compatibilité AllowUpdateChildControlIndexForTabControls non pris en charge 3.0
Commutateur de compatibilité DomainUpDown.UseLegacyScrolling non pris en charge 3.0
Commutateur de compatibilité DoNotLoadLatestRichEditControl non pris en charge 3.0
Commutateur de compatibilité DoNotSupportSelectAllShortcutInMultilineTextBox non pris en charge 3.0
Commutateur de compatibilité DontSupportReentrantFilterMessage non pris en charge 3.0
Commutateur de compatibilité EnableVisualStyleValidation non pris en charge 3.0
Commutateur de compatibilité UseLegacyContextMenuStripSourceControlValue non pris en charge 3.0
Commutateur de compatibilité UseLegacyImages non pris en charge 3.0
Les modèles About et SplashScreen ne fonctionnent pas pour Visual Basic 3.0

.NET Core 3.1

Contrôles supprimés

À compter de .NET Core 3.1, certains contrôles Windows Forms ne sont plus disponibles.

Description des modifications

À compter de .NET Core 3.1, les différents contrôles Windows Forms ne sont plus disponibles. Les contrôles de remplacement qui ont une meilleure conception et prise en charge ont été introduits dans .NET Framework 2.0. Les contrôles déconseillés ont été précédemment supprimés des boîtes à outils du concepteur, mais ils étaient toujours disponibles pour être utilisés.

Les types suivants ne sont plus disponibles :

Version introduite

3.1

Chaque contrôle supprimé a un contrôle de remplacement recommandé. Reportez-vous au tableau suivant :

Suppression du contrôle (API) Remplacement recommandé API associées supprimées
ContextMenu ContextMenuStrip
DataGrid DataGridView DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
Menu Principal MenuStrip
Menu ToolStripDropDown, ToolStripDropDownMenu MenuItemCollection
Élément de menu ToolStripMenuItem
Barre des outils ToolStrip Apparence de la barre d'outils
ToolBarButton ToolStripButton ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Catégorie

Windows Forms

API affectées


Événement CellFormatting non déclenché si l’info-bulle est affichée

Le DataGridView affiche maintenant le texte et les info-bulles d’erreur d’une cellule lorsqu’elle est pointée par une souris et lorsqu’elle est sélectionnée via le clavier. Si une info-bulle est affichée, l’événement DataGridView.CellFormatting n’est pas déclenché.

Description des modifications

Avant .NET Core 3.1, une DataGridView dont la propriété ShowCellToolTips était définie sur true affichait une info-bulle pour le texte et les erreurs d’une cellule lorsque la cellule était pointée par une souris. Les info-bulles n’étaient pas été affichées lorsqu’une cellule était été sélectionnée via le clavier (par exemple, à l’aide de la touche Tab, des touches de raccourci ou de la navigation de direction). Si l’utilisateur a modifié une cellule, puis, alors que le DataGridView était toujours en mode édition, pointé sur une cellule qui n’avait pas la propriété ToolTipText définie, un événement de CellFormatting a été déclenché pour mettre en forme le texte de la cellule à afficher dans la cellule.

Pour répondre aux normes d’accessibilité, à partir de .NET Core 3.1, une DataGridView dont la propriété ShowCellToolTips était définie sur true affichait les info-bulles pour le texte et les erreurs d’une cellule non seulement au moment du pointage, mais également à la sélection via le clavier. En conséquence de cette modification, l’événement CellFormatting n’est pas déclenché lorsque les cellules dont la propriété ToolTipText n’est pas définie sont pointées pendant alors que DataGridView est en mode d’édition. L’événement n’est pas déclenché, car le contenu de la cellule pointée est affiché sous la forme d’une info-bulle au lieu d’être affiché dans la cellule.

Version introduite

3.1

Refactorisez tout code qui dépend de l’événement CellFormatting pendant que le DataGridView est en mode édition.

Catégorie

Windows Forms

API affectées

Aucun


.NET Core 3.0

Police de contrôle par défaut modifiée en Segoe UI 9 pt

Description des modifications

Dans .NET Framework, la propriété Control.DefaultFont a été définie sur Microsoft Sans Serif 8.25 pt. L’image suivante montre une fenêtre qui utilise la police par défaut.

police de contrôle par défaut dans .NET Framework

À compter de .NET Core 3.0, la police par défaut est définie sur Segoe UI 9 pt (la même police que SystemFonts.MessageBoxFont). En raison de cette modification, les formulaires et les contrôles sont dimensionnés environ 27% plus grand pour tenir compte de la plus grande taille de la nouvelle police par défaut. Par exemple:

police de contrôle par défaut dans .NET Core

Cette modification a été apportée pour s’aligner sur les instructions relatives à l’expérience utilisateur (UX) Windows.

Version introduite

3.0

En raison de la modification de la taille des formulaires et des contrôles, assurez-vous que votre application s’affiche correctement.

Pour conserver la police d’origine d’un formulaire unique, définissez sa police par défaut sur Microsoft Sans Serif 8.25 pt. Par exemple:

public MyForm()
{
    InitializeComponent();
    Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}

Vous pouvez également modifier la police par défaut d’une application entière de l’une des manières suivantes :

  • En définissant la propriété MSBuild ApplicationDefaultFont sur « Microsoft Sans Serif, 8.25pt ». Il s’agit de la technique préférée, car elle permet à Visual Studio d’utiliser les nouveaux paramètres dans le concepteur.

    <PropertyGroup>
      <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>
    </PropertyGroup>
    
  • En appelant Application.SetDefaultFont(Font).

    class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.SetDefaultFont(new Font(new FontFamily("Microsoft Sans Serif"), 8.25f));
            Application.Run(new Form1());
        }
    }
    

Catégorie

  • Windows Forms

API affectées

Aucun.


Modernisation de FolderBrowserDialog

Le contrôle FolderBrowserDialog a changé dans les applications Windows Forms pour .NET Core.

Description des modifications

Dans le .NET Framework, Windows Forms utilise la boîte de dialogue suivante pour le contrôle FolderBrowserDialog :

le FolderBrowserDialogControl dans le .NET Framework

Dans .NET Core 3.0, Windows Forms utilise un contrôle COM plus récent introduit dans Windows Vista :

FolderBrowserDialogControl dans .NET Core

Version introduite

3.0

La boîte de dialogue est automatiquement mise à niveau.

Si vous souhaitez conserver la boîte de dialogue d’origine, définissez la propriété FolderBrowserDialog.AutoUpgradeEnabled sur false avant d’afficher la boîte de dialogue, comme illustré par le fragment de code suivant :

var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();

Catégorie

Windows Forms

API affectées


L'attribut "SerializableAttribute" supprimé de certains types Windows Forms

Le SerializableAttribute a été supprimé de certaines classes Windows Forms qui n’ont aucun scénario de sérialisation binaire connu.

Description des modifications

Les types suivants sont décorés avec la SerializableAttribute dans .NET Framework, mais l’attribut a été supprimé dans .NET Core :

Historiquement, ce mécanisme de sérialisation a eu de graves problèmes de maintenance et de sécurité. La maintenance SerializableAttribute sur les types signifie que ces types doivent être testés pour les modifications de sérialisation de version à version et potentiellement les modifications de sérialisation de framework à framework. Cela rend plus difficile l’évolution de ces types et peut être coûteux à maintenir. Ces types n’ont aucun scénario de sérialisation binaire connu, ce qui réduit l’impact de la suppression de l’attribut.

Pour plus d’informations, consultez Sérialisation binaire.

Version introduite

3.0

Mettez à jour tout code qui peut dépendre de ces types marqués comme sérialisables.

Catégorie

Windows Forms

API affectées

  • Aucun

Commutateur de compatibilité AllowUpdateChildControlIndexForTabControls non pris en charge

Le commutateur de compatibilité Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls est pris en charge dans Windows Forms sur .NET Framework 4.6 et versions ultérieures, mais il n’est pas pris en charge sur .NET Core ou .NET 5.0 et versions ultérieures.

Description des modifications

Dans .NET Framework 4.6 et versions ultérieures, la sélection d’un onglet réorganise sa collection de contrôles. Le commutateur de compatibilité Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls permet à une application d’ignorer cette réorganisation lorsque ce comportement n’est pas souhaitable.

Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls n’est pas pris en charge.

Version introduite

3.0

Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.

Catégorie

Windows Forms

API affectées

  • Aucun

Commutateur de compatibilité DomainUpDown.UseLegacyScrolling non pris en charge

Le commutateur de compatibilité Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling, introduit dans .NET Framework 4.7.1, n’est pas pris en charge dans Windows Forms sur .NET Core ou .NET 5.0 et versions ultérieures.

Description des modifications

À compter de .NET Framework 4.7.1, le commutateur de compatibilité Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling a permis aux développeurs de refuser les actions indépendantes de DomainUpDown.DownButton() et de DomainUpDown.UpButton(). Le commutateur a restauré le comportement hérité, dans lequel le DomainUpDown.UpButton() est ignoré si le texte de contexte est présent, et le développeur doit effectuer l'action DomainUpDown.DownButton() sur le contrôle avant l'action DomainUpDown.UpButton(). Pour plus d’informations, consultez l’élément <AppContextSwitchOverrides>.

Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling n’est pas pris en charge.

Version introduite

3.0

Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.

Catégorie

Windows Forms

API affectées


Commutateur de compatibilité DoNotLoadLatestRichEditControl non pris en charge

Le commutateur de compatibilité Switch.System.Windows.Forms.UseLegacyImages, introduit dans .NET Framework 4.7.1, n’est pas pris en charge dans Windows Forms sur .NET Core ou .NET 5.0 et versions ultérieures.

Description des modifications

Dans .NET Framework 4.6.2 et les versions précédentes, le contrôle RichTextBox instancie le contrôle RichEdit Win32 v3.0 et pour les applications qui ciblent .NET Framework 4.7.1, le contrôle RichTextBox instancie RichEdit v4.1 (dans msftedit.dll). Le commutateur de compatibilité Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl a été introduit pour permettre aux applications qui ciblent .NET Framework 4.7.1 et versions ultérieures de refuser le nouveau contrôle RichEdit v4.1 et d’utiliser l’ancien contrôle RichEdit v3 à la place.

Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl n’est pas pris en charge. Seules les nouvelles versions du contrôle RichTextBox sont prises en charge.

Version introduite

3.0

Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.

Catégorie

Windows Forms

API affectées


Commutateur de compatibilité DoNotSupportSelectAllShortcutInMultilineTextBox non pris en charge

Le commutateur de compatibilité Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox, introduit dans .NET Framework 4.6.1, n’est pas pris en charge dans Windows Forms sur .NET Core et .NET 5.0 et versions ultérieures.

Description des modifications

À compter de .NET Framework 4.6.1, le fait de sélectionner la touche de raccourci Ctrl + A dans un contrôle TextBox entraînait la sélection de tout le texte. Dans .NET Framework 4.6 et les versions précédentes, la sélection de la touche de raccourciCtrl A n’a pas pu sélectionner tout le texte si les propriétés Textbox.ShortcutsEnabled et ont tous les deux été définies sur . Le commutateur de compatibilité Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox a été introduit dans .NET Framework 4.6.1 pour conserver le comportement d’origine. Pour plus d’informations, consultez TextBox.ProcessCmdKey.

Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox n’est pas pris en charge.

Version introduite

3.0

Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.

Catégorie

Windows Forms

API affectées

  • Aucun

Commutateur de compatibilité DontSupportReentrantFilterMessage non pris en charge

Le commutateur de compatibilité Switch.System.Windows.Forms.DontSupportReentrantFilterMessage, introduit dans .NET Framework 4.6.1, n’est pas pris en charge dans Windows Forms sur .NET Core et .NET 5.0 et versions ultérieures.

Description des modifications

À compter du .NET Framework 4.6.1, le commutateur de compatibilité Switch.System.Windows.Forms.DontSupportReentrantFilterMessage résout les exceptions possibles IndexOutOfRangeException lorsque le message Application.FilterMessage est appelé avec une implémentation de IMessageFilter.PreFilterMessage personnalisée. Pour plus d’informations, consultez Atténuation : implémentations IMessageFilter.PreFilterMessage personnalisées.

Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.DontSupportReentrantFilterMessage n’est pas pris en charge.

Version introduite

3.0

Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.

Catégorie

Windows Forms

API affectées


Commutateur de compatibilité EnableVisualStyleValidation non pris en charge

Le commutateur de compatibilité Switch.System.Windows.Forms.EnableVisualStyleValidation n’est pas pris en charge dans Windows Forms sur .NET Core ou .NET 5.0 et versions ultérieures.

Description des modifications

Dans .NET Framework, le commutateur de compatibilité Switch.System.Windows.Forms.EnableVisualStyleValidation a permis à une application de refuser la validation des styles visuels fournis dans un formulaire numérique.

Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.EnableVisualStyleValidation n’est pas pris en charge.

Version introduite

3.0

Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.

Catégorie

Windows Forms

API affectées

  • Aucun

Commutateur de compatibilité UseLegacyContextMenuStripSourceControlValue non pris en charge

Le commutateur de compatibilité Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue, qui a été introduit dans .NET Framework 4.7.2, n’est pas pris en charge dans Windows Forms sur .NET Core ou .NET 5.0 et versions ultérieures.

Description des modifications

À compter de .NET Framework 4.7.2, le commutateur de compatibilité Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue permet au développeur de refuser le nouveau comportement de la propriété ContextMenuStrip.SourceControl, qui retourne désormais une référence au contrôle de code source. Le comportement précédent de la propriété était de retourner null. Pour plus d’informations, consultez l’élément <AppContextSwitchOverrides>.

Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue n’est pas pris en charge.

Version introduite

3.0

Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.

Catégorie

Windows Forms

API affectées


Commutateur de compatibilité UseLegacyImages non pris en charge

Le commutateur de compatibilité Switch.System.Windows.Forms.UseLegacyImages, qui a été introduit dans .NET Framework 4.8, n’est pas pris en charge dans Windows Forms sur .NET Core ou .NET 5.0 et versions ultérieures.

Description des modifications

À compter de .NET Framework 4.8, le commutateur de compatibilité Switch.System.Windows.Forms.UseLegacyImages a résolu les problèmes de mise à l’échelle d’images possibles dans les scénarios ClickOnce dans des environnements DPI élevés. Lorsqu’il est défini sur true, le commutateur permet à l’utilisateur de restaurer la mise à l’échelle d’images héritées sur des écrans haute résolution dont la mise à l’échelle est définie sur plus de 100%. Pour plus d’informations, consultez les notes de publication de .NET Framework 4.8 sur GitHub.

Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.UseLegacyImages n’est pas pris en charge.

Version introduite

3.0

Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.

Catégorie

Windows Forms

API affectées

  • Aucun

Les modèles À propos et SplashScreen sont cassés

Les fichiers About.vb et SplashScreen.vb générés par Visual Studio contiennent des références aux types dans l’espace de noms My qui ne sont pas disponibles .NET Core 3.0 et 3.1.

Version introduite

3.0

Description des modifications

.NET Core 3.0 et 3.1 ne contiennent pas de prise en charge complète de Visual Basic My. Les modèles de formulaires About et SplashScreen dans les applications Visual Studio pour Visual Basic Windows Forms font référence aux propriétés du type My.Application.Info qui ne sont pas disponibles.

La prise en charge de Visual Basic My a été améliorée dans .NET 5, mettez à niveau votre projet vers .NET 5 ou version ultérieure.

ou

Corrigez les erreurs du compilateur dans les types About et SplashScreen dans votre application. Utilisez la classe System.Reflection.Assembly pour obtenir les informations fournies par le type de My.Application.Info. Un port normal des deux formulaires est disponible ici.

Conseil

Il s’agit d’exemples de code et non optimisé. La liste des attributs doit être mise en cache pour réduire le temps de chargement du formulaire.

À propos de

Imports System.Reflection

Public NotInheritable Class About

    Private Sub about_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Set the title of the form.
        Dim applicationTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title

        If String.IsNullOrEmpty(applicationTitle) Then
            applicationTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
        End If

        Me.Text = String.Format("About {0}", applicationTitle)
        ' Initialize all of the text displayed on the About Box.
        ' TODO: Customize the application's assembly information in the "Application" pane of the project
        '    properties dialog (under the "Project" menu).
        Me.LabelProductName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyProductAttribute)()?.Product, "")
        Me.LabelVersion.Text = String.Format("Version {0}", Assembly.GetExecutingAssembly().GetName().Version)
        Me.LabelCopyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
        Me.LabelCompanyName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCompanyAttribute)()?.Company, "")
        Me.TextBoxDescription.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyDescriptionAttribute)()?.Description, "")
    End Sub

    Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click
        Me.Close()
    End Sub

End Class

SplashScreen

Imports System.Reflection

Public NotInheritable Class SplashScreen

    Private Sub SplashScreen1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'Set up the dialog text at runtime according to the application's assembly information.  

        'TODO: Customize the application's assembly information in the "Application" pane of the project
        '  properties dialog (under the "Project" menu).

        'Application title
        Dim appTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title

        If String.IsNullOrEmpty(appTitle) Then
            appTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
        End If

        ApplicationTitle.Text = appTitle

        Dim versionValue = Assembly.GetExecutingAssembly().GetName().Version

        'Format the version information using the text set into the Version control at design time as the
        '  formatting string.  This allows for effective localization if desired.
        '  Build and revision information could be included by using the following code and changing the
        '  Version control's designtime text to "Version {0}.{1:00}.{2}.{3}" or something similar.  See
        '  String.Format() in Help for more information.
        '
        '    Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor, versionValue.Build, versionValue.Revision)

        Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor)

        'Copyright info
        Copyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
    End Sub

End Class

Catégorie

Visual Basic Windows Forms

API affectées

Aucun


Voir aussi