Поделиться через


Критические изменения в 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 pt 3.0
Модернизация FolderBrowserDialog 3.0
SerializableAttribute удалены из некоторых типов Windows Forms 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
Шаблоны «О программе» и 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, которые удаляются
Контекстное меню 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


Событие 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 Framework

Начиная с .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:

Элемент управления FolderBrowserDialog в .NET Framework

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

FolderBrowserDialogControl в .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.

Исторически этот механизм сериализации имел серьезные проблемы с обслуживанием и безопасностью. Поддержка 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

Никакой


См. также