Критические изменения в 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
- DataGrid.HitTestInfo
- DataGridBoolColumn
- DataGridCell
- DataGridColumnStyle
- DataGridColumnStyle.DataGridColumnHeaderAccessibleObject
- DataGridColumnStyle.CompModSwitches
- 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, которые удаляются |
---|---|---|
Контекстное меню | ContextMenuStrip | |
DataGrid | DataGridView | DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType |
Главное меню | MenuStrip | |
Меню | ToolStripDropDown, ToolStripDropDownMenu | MenuItemCollection |
Элемент меню | ToolStripMenuItem | |
Панель инструментов | ТулСтрип | Внешний вид панели инструментов |
Кнопка панели инструментов | кнопка на панели инструментов | 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 pt
Изменение описания
В .NET Framework для свойства Control.DefaultFont задано значение Microsoft Sans Serif 8.25 pt
. На следующем рисунке показано окно, использующее шрифт по умолчанию.
шрифт элемента управления по умолчанию
Начиная с .NET Core 3.0 шрифт по умолчанию имеет значение Segoe UI 9 pt
(тот же шрифт, что и SystemFonts.MessageBoxFont). В результате этого изменения формы и элементы управления увеличены примерно на 27%, учитывая увеличенный размер нового шрифта по умолчанию. Например:
.NET Core
Это изменение было внесено для приведения в соответствие с руководящими принципами пользовательского опыта (UX) Windows.
Представленная версия
3.0
Рекомендуемое действие
Из-за изменения размера форм и контролов убедитесь, что приложение правильно отображается.
Чтобы сохранить исходный шрифт для одной формы, задайте для его шрифта по умолчанию значение Microsoft Sans Serif 8.25 pt
. Например:
public MyForm()
{
InitializeComponent();
Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}
Кроме того, можно изменить шрифт по умолчанию для всего приложения следующим образом:
Присвойв свойству MSBuild
ApplicationDefaultFont
значение "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.
Изменение описания
В .NET Framework Windows Forms использует следующее диалоговое окно для элемента управления FolderBrowserDialog:
.NET Framework
В .NET Core 3.0 Windows Forms использует новый элемент управления на основе COM, который появился в Windows Vista:
.NET Core
Представленная версия
3.0
Рекомендуемое действие
Диалоговое окно будет автоматически обновлено.
Если вы хотите сохранить исходное диалоговое окно, задайте для свойства FolderBrowserDialog.AutoUpgradeEnabled значение false
перед отображением диалогового окна, как показано в следующем фрагменте кода:
var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();
Категория
Windows Forms
Затронутые API
SerializableAttribute удален из некоторых типов Windows Forms
SerializableAttribute удалены из некоторых классов Windows Forms, которые не имеют известных сценариев двоичной сериализации.
Изменение описания
Следующие типы аннотированы с помощью SerializableAttribute в .NET Framework, но атрибут был удален в .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 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 и использовать старый элемент управления RichEdit версии 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
Категория
Visual Basic Windows Forms
Затронутые API
Никакой