Критические изменения в Windows Forms для .NET Core 3.0 и 3.1

Поддержка Windows Forms была добавлена в .NET Core в версии 3.0. В этой статье перечислены критические изменения для Windows Forms, сгруппированные по версии .NET, в которой они появились. Если вы обновляете приложение Windows Forms с .NET Framework или с предыдущей версии .NET Core (3.0 или более поздней), эта статья для вас актуальна.

На этой странице описаны следующие критические изменения:

Критическое изменение Представленные версии
Удаленные элементы управления 3.1
При отображении подсказки не возникает событие CellFormatting 3.1
Шрифт Control.DefaultFont изменен на Segoe UI 9 пт 3.0
Модернизация FolderBrowserDialog 3.0
Из некоторых типов Windows Forms удален атрибут SerializableAttribute 3.0
Параметр совместимости AllowUpdateChildControlIndexForTabControls не поддерживается 3.0
Параметр совместимости DomainUpDown.UseLegacyScrolling не поддерживается 3.0
Параметр совместимости DoNotLoadLatestRichEditControl не поддерживается 3.0
Параметр совместимости DoNotSupportSelectAllShortcutInMultilineTextBox не поддерживается 3.0
Параметр совместимости DontSupportReentrantFilterMessage не поддерживается 3.0
Параметр совместимости EnableVisualStyleValidation не поддерживается 3.0
Параметр совместимости UseLegacyContextMenuStripSourceControlValue не поддерживается 3.0
Параметр совместимости UseLegacyImages не поддерживается 3.0
Шаблоны About и SplashScreen не работают для Visual Basic 3.0

.NET Core 3.1.

Удаленные элементы управления

Начиная с .NET Core 3.1, некоторые элементы управления Windows Forms больше не доступны.

Описание изменения

Начиная с .NET Core 3.1, различные элементы управления Windows Forms больше не доступны. В .NET Framework 2.0 они были заменены элементами управления с улучшенной структурой и поддержкой. Нерекомендуемые элементы управления были ранее удалены из панелей элементов конструктора, но по-прежнему были доступны для использования.

Следующие типы больше не доступны.

Представленные версии

3.1

Каждый удаленный элемент управления имеет рекомендуемую замену. См. таблицу ниже.

Удаленный элемент управления (API) Рекомендуемая замена Связанные удаленные интерфейсы API
ContextMenu ContextMenuStrip
DataGrid DataGridView DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
MainMenu MenuStrip
Меню ToolStripDropDown, ToolStripDropDownMenu MenuItemCollection
MenuItem ToolStripMenuItem
ToolBar ToolStrip ToolBarAppearance
ToolBarButton ToolStripButton ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Категория

Windows Forms

Затронутые API


При отображении подсказки не возникает событие CellFormatting

DataGridView теперь отображает всплывающие подсказки для ошибок и текста в ячейке при наведении указателя мыши и при выборе с помощью клавиатуры. Если подсказка отображается, событие DataGridView.CellFormatting не возникает.

Описание изменения

До .NET Core 3.1 DataGridView, у которого для свойства ShowCellToolTips было задано значение true, отображал подсказку для ошибок и текста в ячейке при наведении указателя мыши на эту ячейку. Подсказки не отображались при выборе ячейки с помощью клавиатуры (например, с помощью клавиши TAB, сочетаний клавиш или клавиш со стрелками). Если пользователь изменил ячейку, а затем, пока DataGridView находился в режиме редактирования, навел указатель на ячейку, для которой не задано свойство ToolTipText, возникало событие CellFormatting для форматирования текста ячейки, отображаемого в ней.

Чтобы удовлетворить требованиям стандартов специальных возможностей, начиная с .NET Core 3.1, DataGridView, у которого для свойства ShowCellToolTips задано значение true, отображает подсказки для ошибок и текста ячейки не только при наведении указателя мыши, но и при выборе ячейки с помощью клавиатуры. Как следствие этого изменения событие CellFormattingне возникает, когда указатель наводится на ячейки, для которых не задано свойство ToolTipText, пока DataGridView находится в режиме редактирования. Событие не возникает, так как содержимое ячейки, на которую наведен указатель, выводится в виде подсказки, а не отображается в ячейке.

Представленные версии

3.1

Выполните рефакторинг всего кода, зависящего от события CellFormatting, когда DataGridView находится в режиме редактирования.

Категория

Windows Forms

Затронутые API

нет


.NET Core 3.0

Шрифт элемента управления по умолчанию изменен на Segoe UI 9 пт

Описание изменения

В .NET Framework свойству Control.DefaultFont присвоено значение Microsoft Sans Serif 8 pt. На следующем рисунке показано окно, в котором используется шрифт по умолчанию.

Default control font in .NET Framework

Начиная с .NET Core 3.0 шрифтом по умолчанию является Segoe UI 9 pt (тот же шрифт, что и SystemFonts.MessageBoxFont). В результате этого изменения размер форм и элементов управления увеличен на 27 % с учетом увеличенного размера нового шрифта по умолчанию. Например:

Default control font in .NET Core

Это изменение было внесено в соответствии с рекомендациями по пользовательскому интерфейсу Windows.

Представленные версии

3.0

Так как размер форм и элементов управления изменился, убедитесь, что приложение отображается правильно.

Чтобы оставить исходный шрифт, задайте для формы шрифт по умолчанию: Microsoft Sans Serif 8 pt. Например:

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

Категория

  • Windows Forms

Затронутые API

Нет.


Модернизация FolderBrowserDialog

В приложениях Windows Forms для .NET Core в элемент управления FolderBrowserDialog внесены изменения.

Описание изменения

В Windows Forms в .NET Framework для элемента управления FolderBrowserDialog используется следующее диалоговое окно:

The FolderBrowserDialogControl in the .NET Framework

В .NET Core 3.0 в Windows Forms используется более новый элемент управления на основе COM, появившийся в Windows Vista:

The FolderBrowserDialogControl in the .NET Core

Представленные версии

3.0

Диалоговое окно будет обновлено автоматически.

Если вы хотите оставить исходное диалоговое окно, перед отображением диалогового окна задайте для свойства FolderBrowserDialog.AutoUpgradeEnabled значение false, как показано в следующем фрагменте кода:

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

Категория

Windows Forms

Затронутые API


Из некоторых типов Windows Forms удален атрибут SerializableAttribute

Атрибут SerializableAttribute был удален из некоторых классов Windows Forms, для которых нет известных сценариев двоичной сериализации.

Описание изменения

Следующие типы помечаются в .NET Framework атрибутом SerializableAttribute, который удален в .NET Core:

Механизм сериализации всегда имел серьезные проблемы в плане обслуживания и безопасности. Поддержка SerializableAttribute для типов означает, что их необходимо проверять на наличие изменений сериализации в разных версиях, а также, возможно, на разных платформах. Это затрудняет развитие таких типов и делает их обслуживание затратнее. Для этих типов нет известных сценариев двоичной сериализации, благодаря чему удаление атрибута имеет минимальные последствия.

Дополнительные сведения см. в разделе Двоичная сериализация.

Представленные версии

3.0

Измените код, работа которого зависит от возможности сериализации этих типов.

Категория

Windows Forms

Затронутые API

  • нет

Параметр совместимости AllowUpdateChildControlIndexForTabControls не поддерживается

Параметр совместимости Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls поддерживается в Windows Forms в .NET Framework 4.6 и более поздних версиях, но не поддерживается в .NET Core,а также в .NET Core 5.0 и более поздних версий.

Описание изменения

В .NET Framework 4.6 и более поздних версиях при выборе вкладки ее коллекция элементов управления переупорядочивается. Параметр совместимости Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls позволяет приложению отменить переупорядочивание, если оно не требуется.

В .NET Core и .NET 5.0 и более поздних версий параметр Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls не поддерживается.

Представленные версии

3.0

Удалите параметр. Он не поддерживается, и альтернативного варианта нет.

Категория

Windows Forms

Затронутые API

  • нет

Параметр совместимости DomainUpDown.UseLegacyScrolling не поддерживается

Параметр совместимости Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling, появившийся в .NET Framework 4.7.1, не поддерживается в Windows Forms в .NET Core и .NET 5.0 и более поздних версий.

Описание изменения

Начиная с версии .NET Framework 4.7.1 параметр совместимости Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling позволял разработчикам отказаться от независимых действий DomainUpDown.DownButton() и DomainUpDown.UpButton(). Параметр восстанавливал прежнее поведение, при котором действие DomainUpDown.UpButton() игнорируется, если присутствует текст контекста, и разработчику необходимо использовать действие DomainUpDown.DownButton() для элемента управления перед использованием действия DomainUpDown.UpButton(). Дополнительные сведения см. в элементе <AppContextSwitchOverrides.>

В .NET Core и .NET 5.0 и более поздних версий параметр Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling не поддерживается.

Представленные версии

3.0

Удалите параметр. Он не поддерживается, и альтернативного варианта нет.

Категория

Windows Forms

Затронутые API


Параметр совместимости DoNotLoadLatestRichEditControl не поддерживается

Параметр совместимости Switch.System.Windows.Forms.UseLegacyImages, появившийся в .NET Framework 4.7.1, не поддерживается в Windows Forms в .NET Core и .NET 5.0 и более поздних версий.

Описание изменения

В платформа .NET Framework 4.6.2 и предыдущих версиях RichTextBox элемент управления создает экземпляр элемента управления Win32 RichEdit версии 3.0 и для приложений, предназначенных для платформа .NET Framework 4.7.1, RichTextBox элемент управления создает экземпляр RichEdit версии 4.1 (в msftedit.dll). Параметр совместимости Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl был введен для того, чтобы в приложениях, предназначенных для .NET Framework 4.7.1 и более поздних версий, можно было отказаться от использования нового элемента управления RichEdit версии 4.1 и использовать вместо него прежнюю версию 3.

В .NET Core и .NET 5.0 и более поздних версий параметр Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl не поддерживается. Поддерживаются только новые версии элемента управления RichTextBox.

Представленные версии

3.0

Удалите параметр. Он не поддерживается, и альтернативного варианта нет.

Категория

Windows Forms

Затронутые API


Параметр совместимости DoNotSupportSelectAllShortcutInMultilineTextBox не поддерживается

Параметр совместимости Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox, появившийся в .NET Framework 4.6.1, не поддерживается в Windows Forms в .NET Core и .NET 5.0 и более поздних версий.

Описание изменения

Начиная с .NET Framework 4.6.1, при нажатии клавиш CTRL + A в элементе управления TextBox выделяется весь текст. В .NET Framework 4.6 и более ранних версиях при нажатии клавиш CTRL + A выделение всего текста не происходило, если свойства Textbox.ShortcutsEnabled и TextBox.Multiline имели значение true. Параметр совместимости Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox появился в .NET Framework 4.6.1 для восстановления прежнего поведения. Дополнительные сведения см. по адресу TextBox.ProcessCmdKey.

В .NET Core и .NET 5.0 и более поздних версий параметр Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox не поддерживается.

Представленные версии

3.0

Удалите параметр. Он не поддерживается, и альтернативного варианта нет.

Категория

Windows Forms

Затронутые API

  • нет

Параметр совместимости DontSupportReentrantFilterMessage не поддерживается

Параметр совместимости Switch.System.Windows.Forms.DontSupportReentrantFilterMessage, появившийся в .NET Framework 4.6.1, не поддерживается в Windows Forms в .NET Core и .NET 5.0 и более поздних версий.

Описание изменения

Начиная с .NET Framework 4.6.1, параметр совместимости Switch.System.Windows.Forms.DontSupportReentrantFilterMessage устраняет возможные исключения IndexOutOfRangeException при вызове сообщения Application.FilterMessage с пользовательской реализацией IMessageFilter.PreFilterMessage. Дополнительные сведения см. в разделе Устранение рисков: пользовательские реализации IMessageFilter.PreFilterMessage.

В .NET Core и .NET 5.0 и более поздних версий параметр Switch.System.Windows.Forms.DontSupportReentrantFilterMessage не поддерживается.

Представленные версии

3.0

Удалите параметр. Он не поддерживается, и альтернативного варианта нет.

Категория

Windows Forms

Затронутые API


Параметр совместимости EnableVisualStyleValidation не поддерживается

Параметр совместимости Switch.System.Windows.Forms.EnableVisualStyleValidation не поддерживается в Windows Forms в .NET Core или .NET 5.0 и более поздних версий.

Описание изменения

В .NET Framework параметр совместимости Switch.System.Windows.Forms.EnableVisualStyleValidation позволял приложению отказаться от проверки визуальных стилей, предоставленных в числовой форме.

В .NET Core и .NET 5.0 и более поздних версий параметр Switch.System.Windows.Forms.EnableVisualStyleValidation не поддерживается.

Представленные версии

3.0

Удалите параметр. Он не поддерживается, и альтернативного варианта нет.

Категория

Windows Forms

Затронутые API

  • нет

Параметр совместимости UseLegacyContextMenuStripSourceControlValue не поддерживается

Параметр совместимости Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue, появившийся в .NET Framework 4.7.2, не поддерживается в Windows Forms в .NET Core и .NET 5.0 и более поздних версий.

Описание изменения

Начиная с версии .NET Framework 4.7.2 параметр совместимости Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue позволяет разработчикам отказаться от нового поведения свойства ContextMenuStrip.SourceControl, которое теперь возвращает ссылку на систему управления версиями. Ранее это свойство возвращало null. Дополнительные сведения см. в элементе <AppContextSwitchOverrides.>

В .NET Core и .NET 5.0 и более поздних версий параметр Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue не поддерживается.

Представленные версии

3.0

Удалите параметр. Он не поддерживается, и альтернативного варианта нет.

Категория

Windows Forms

Затронутые API


Параметр совместимости UseLegacyImages не поддерживается

Параметр совместимости Switch.System.Windows.Forms.UseLegacyImages, появившийся в .NET Framework 4.8, не поддерживается в Windows Forms в .NET Core и .NET 5.0 и более поздних версий.

Описание изменения

Начиная с .NET Framework 4.8 параметр совместимости Switch.System.Windows.Forms.UseLegacyImages устраняет возможные проблемы с масштабированием изображений в сценариях ClickOnce в средах с высоким DPI. Если задано значение true, параметр позволяет пользователю восстановить прежний способ масштабирования изображений при высоком уровне DPI, когда масштаб составляет более 100 %. Дополнительные сведения см. в заметках о выпуске .NET Framework 4.8 в GitHub.

В .NET Core и .NET 5.0 и более поздних версий параметр Switch.System.Windows.Forms.UseLegacyImages не поддерживается.

Представленные версии

3.0

Удалите параметр. Он не поддерживается, и альтернативного варианта нет.

Категория

Windows Forms

Затронутые API

  • нет

Шаблоны About и SplashScreen не работают

Файлы About.vb и SplashScreen.vb, созданные Visual Studio, содержат ссылки на типы в пространстве имен My, которые недоступны для .NET Core 3.0 и 3.1.

Представленные версии

3.0

Описание изменения

.NET Core 3,0 и 3,1 не предоставляет полную поддержку функции My в Visual Basic. Шаблоны форм About и SplashScreen в Visual Studio для приложений Windows Forms на Visual Basic ссылаются на недоступные свойства типа My.Application.Info.

Поддержка функции My в Visual Basic была улучшена в .NET 5, обновите свой проект до .NET 5 или более поздней версии.

–или–

Исправьте ошибки компилятора в типах About и SplashScreen в приложении. Используйте класс System.Reflection.Assembly для получения сведений, предоставленных типом My.Application.Info. Прямой порт обеих форм доступен здесь.

Совет

Это пример кода, который является оптимизированным. Список атрибутов следует помещать в кэш, чтобы сократить время загрузки формы.

О программе

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

Экран-заставка

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

Категория

Windows Forms на Visual Basic

Затронутые API

нет


См. также