Критические изменения в 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 или более поздней), эта статья для вас актуальна.
На этой странице описаны следующие критические изменения:
.NET Core 3.1.
Удаленные элементы управления
Начиная с .NET Core 3.1, некоторые элементы управления Windows Forms больше не доступны.
Описание изменения
Начиная с .NET Core 3.1, различные элементы управления Windows Forms больше не доступны. В .NET Framework 2.0 они были заменены элементами управления с улучшенной структурой и поддержкой. Нерекомендуемые элементы управления были ранее удалены из панелей элементов конструктора, но по-прежнему были доступны для использования.
Следующие типы больше не доступны.
- ContextMenu
- DataGrid
- DataGrid.HitTestType
- DataGridBoolColumn
- DataGridCell
- DataGridColumnStyle
- DataGridLineStyle
- DataGridParentRowsLabelStyle
- DataGridPreferredColumnWidthTypeConverter
- DataGridTableStyle
- DataGridTextBox
- DataGridTextBoxColumn
- GridColumnStylesCollection
- GridTablesFactory
- GridTableStylesCollection
- IDataGridEditingService
- IMenuEditorService
- MainMenu
- Menu
- Menu.MenuItemCollection
- MenuItem
- ToolBar
- ToolBarAppearance
- ToolBarButton
- ToolBar.ToolBarButtonCollection
- ToolBarButtonClickEventArgs
- ToolBarButtonStyle
- ToolBarTextAlign
Представленные версии
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
- System.Windows.Forms.ContextMenu
- System.Windows.Forms.GridColumnStylesCollection
- System.Windows.Forms.GridTablesFactory
- System.Windows.Forms.GridTableStylesCollection
- System.Windows.Forms.IDataGridEditingService
- System.Windows.Forms.MainMenu
- System.Windows.Forms.Menu
- System.Windows.Forms.Menu.MenuItemCollection
- System.Windows.Forms.MenuItem
- System.Windows.Forms.ToolBar
- System.Windows.Forms.ToolBar.ToolBarButtonCollection
- System.Windows.Forms.ToolBarAppearance
- System.Windows.Forms.ToolBarButton
- System.Windows.Forms.ToolBarButtonClickEventArgs
- System.Windows.Forms.ToolBarButtonStyle
- System.Windows.Forms.ToolBarTextAlign
- System.Windows.Forms.DataGrid
- System.Windows.Forms.DataGrid.HitTestType
- System.Windows.Forms.DataGridBoolColumn
- System.Windows.Forms.DataGridCell
- System.Windows.Forms.DataGridColumnStyle
- System.Windows.Forms.DataGridLineStyle
- System.Windows.Forms.DataGridParentRowsLabelStyle
- System.Windows.Forms.DataGridPreferredColumnWidthTypeConverter
- System.Windows.Forms.DataGridTableStyle
- System.Windows.Forms.DataGridTextBox
- System.Windows.Forms.DataGridTextBoxColumn
- System.Windows.Forms.Design.IMenuEditorService
При отображении подсказки не возникает событие 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.25 pt
. На следующем рисунке показано окно, в котором используется шрифт по умолчанию.
Начиная с .NET Core 3.0 шрифтом по умолчанию является Segoe UI 9 pt
(тот же шрифт, что и SystemFonts.MessageBoxFont). В результате этого изменения размер форм и элементов управления увеличен на 27 % с учетом увеличенного размера нового шрифта по умолчанию. Например:
Это изменение было внесено в соответствии с рекомендациями по пользовательскому интерфейсу Windows.
Представленные версии
3.0
Рекомендуемое действие
Так как размер форм и элементов управления изменился, убедитесь, что приложение отображается правильно.
Чтобы сохранить исходный шрифт для одной формы, задайте для его шрифта Microsoft Sans Serif 8.25 pt
по умолчанию значение. Например:
public MyForm()
{
InitializeComponent();
Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}
Кроме того, можно изменить шрифт по умолчанию для всего приложения следующим образом:
Присвойв свойству
ApplicationDefaultFont
MSBuild значение Microsoft Sans Serif, 8.25pt. Это предпочтительный способ, так как он позволяет Visual Studio использовать новые параметры в конструкторе.<PropertyGroup> <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont> </PropertyGroup>
Путем вызова 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()); } }
Категория
- Windows Forms
Затронутые API
Нет.
Модернизация FolderBrowserDialog
В приложениях Windows Forms для .NET Core в элемент управления FolderBrowserDialog внесены изменения.
Описание изменения
В Windows Forms в .NET Framework для элемента управления FolderBrowserDialog используется следующее диалоговое окно:
В .NET Core 3.0 в Windows Forms используется более новый элемент управления на основе COM, появившийся в Windows Vista:
Представленные версии
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:
System.InvariantComparer
- System.ComponentModel.Design.ExceptionCollection
- System.ComponentModel.Design.Serialization.CodeDomSerializerException
System.ComponentModel.Design.Serialization.CodeDomComponentSerializationService.CodeDomSerializationStore
- System.Drawing.Design.ToolboxItem
System.Resources.ResXNullRef
System.Resources.ResXDataNode
System.Resources.ResXFileRef
- System.Windows.Forms.Cursor
System.Windows.Forms.NativeMethods.MSOCRINFOSTRUCT
System.Windows.Forms.NativeMethods.MSG
Механизм сериализации всегда имел серьезные проблемы в плане обслуживания и безопасности. Поддержка 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
нет
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по