Alterações interruptivas no Windows Forms para o .NET Core 3.0 e 3.1

O suporte ao Windows Forms foi adicionado ao .NET Core na versão 3.0. Este artigo lista as alterações interruptivas para Windows Forms segundo versão do .NET na qual elas foram introduzidas. Se você estiver atualizando um aplicativo Windows Forms de .NET Framework ou de uma versão anterior do .NET Core (3.0 ou posterior), este artigo se aplicará a você.

As seguintes alterações interruptivas estão documentadas nesta página:

Alteração interruptiva Versão introduzida
Controles removidos 3.1
O evento CellFormatting não é gerado quando a dica de ferramenta é mostrada 3.1
Control.DefaultFont alterado para Segoe UI 9 pt 3.0
Modernização do FolderBrowserDialog 3.0
SerializableAttribute removido de alguns tipos do Windows Forms 3.0
Não há suporte para a opção de compatibilidade AllowUpdateChildControlIndexForTabControls 3.0
Não há suporte para a opção de compatibilidade DomainUpDown.UseLegacyScrolling 3.0
Não há suporte para a opção de compatibilidade DoNotLoadLatestRichEditControl 3.0
Não há suporte para a opção de compatibilidade DoNotSupportSelectAllShortcutInMultilineTextBox 3.0
Não há suporte para a opção de compatibilidade DontSupportReentrantFilterMessage 3.0
Não há suporte para a opção de compatibilidade EnableVisualStyleValidation 3.0
Não há suporte para a opção de compatibilidade UseLegacyContextMenuStripSourceControlValue 3.0
Não há suporte para a opção de compatibilidade UseLegacyImages 3.0
Os modelos About e SplashScreen estão interrompidos no Visual Basic 3.0

.NET Core 3.1

Controles removidos

A partir do .NET Core 3.1, alguns controles do Windows Forms não estão mais disponíveis.

Descrição das alterações

A partir do .NET Core 3.1, vários controles do Windows Forms não estão mais disponíveis. Controles de substituição que têm design e suporte aprimorados foram introduzidos no .NET Framework 2.0. Os controles preteridos já foram removidos das caixas de ferramentas do designer, mas ainda estavam disponíveis para serem usados.

Os seguintes tipos não estão mais disponíveis:

Versão introduzida

3.1

Cada controle removido tem um controle de substituição recomendado. Consulte a tabela a seguir:

Controle removido (API) Substituição recomendada APIs associadas que foram removidas
ContextMenu ContextMenuStrip
DataGrid DataGridView DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
MainMenu MenuStrip
Menu ToolStripDropDown, ToolStripDropDownMenu MenuItemCollection
MenuItem ToolStripMenuItem
ToolBar ToolStrip ToolBarAppearance
ToolBarButton ToolStripButton ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Categoria

Windows Forms

APIs afetadas


O evento CellFormatting não é gerado quando a dica de ferramenta é mostrada

Um DataGridView agora mostra as dicas de texto e de erro de uma célula quando focalizado por um mouse e quando selecionado por meio do teclado. Se uma dica de ferramenta for mostrada, o evento DataGridView.CellFormatting não será gerado.

Descrição das alterações

Antes do .NET Core 3.1, um DataGridView que tinha a propriedade ShowCellToolTips definida como true mostrava uma dica de ferramenta para o texto e os erros da célula quando ela era focalizada por um mouse. As dicas de ferramenta não eram mostradas quando uma célula era selecionada por meio do teclado (por exemplo, usando a tecla Tab, teclas de atalho ou a navegação com as setas). Se o usuário editava uma célula e, enquanto DataGridView ainda estava no modo de edição, passava sobre uma célula que não tinha a propriedade ToolTipText definida, um evento CellFormatting era gerado para formatar o texto da célula da exibição na célula.

Para atender aos padrões de acessibilidade, começando no .NET Core 3.1, um DataGridView que tem a propriedade ShowCellToolTips definida como true mostra as dicas de ferramentas do texto e os erros de uma célula não apenas quando a célula é focalizada, mas também quando ela é selecionada por meio do teclado. Como consequência dessa alteração, o evento CellFormattingnão é gerado quando células que não têm o conjunto de propriedades ToolTipText são focalizadas enquanto DataGridView está no modo de edição. O evento não é gerado porque o conteúdo da célula focalizada é mostrado como uma dica de ferramenta em vez de ser exibido na célula.

Versão introduzida

3.1

Refatorar códigos que dependem do evento CellFormatting enquanto DataGridView está no modo de edição.

Categoria

Windows Forms

APIs afetadas

Nenhum


.NET Core 3.0

A fonte de controle padrão foi alterada para Segoe UI 9 pt

Descrição das alterações

No .NET Framework, a propriedade Control.DefaultFont foi definida como Microsoft Sans Serif 8.25 pt. A imagem a seguir mostra uma janela que usa a fonte padrão.

Fonte de controle padrão no .NET Framework

Do .NET Core 3.0 em diante, a fonte padrão é definida como Segoe UI 9 pt (a mesma fonte que SystemFonts.MessageBoxFont). Como resultado dessa alteração, os formulários e os controles ficaram 27% maiores para considerar o tamanho maior da nova fonte padrão. Por exemplo:

Fonte de controle padrão no .NET Core

Essa alteração foi feita para se alinhar às diretrizes de UX (experiência do usuário) do Windows.

Versão introduzida

3.0

Devido à alteração no tamanho dos formulários e controles, verifique se o aplicativo é renderizado corretamente.

Para manter a fonte original de um único formulário, defina sua fonte padrão como Microsoft Sans Serif 8.25 pt. Por exemplo:

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

Ou você pode alterar a fonte padrão de um aplicativo inteiro de uma das seguintes maneiras:

  • Definindo a propriedade ApplicationDefaultFont MSBuild como "Microsoft Sans Serif, 8.25pt". Essa é a técnica preferida porque permite que o Visual Studio use as novas configurações no designer.

    <PropertyGroup>
      <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>
    </PropertyGroup>
    
  • Chamando 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());
        }
    }
    

Categoria

  • Windows Forms

APIs afetadas

Nenhum.


Modernização do FolderBrowserDialog

O controle FolderBrowserDialog foi alterado nos aplicativos do Windows Forms do .NET Core.

Descrição das alterações

No .NET Framework, o Windows Forms usa a seguinte caixa de diálogo para o controle FolderBrowserDialog:

O FolderBrowserDialogControl no .NET Framework

No .NET Core 3.0, o Windows Forms usa um controle mais recente baseado em COM, que foi introduzido no Windows Vista:

O FolderBrowserDialogControl no .NET Core

Versão introduzida

3.0

A caixa de diálogo será atualizada automaticamente.

Se você quiser manter a caixa de diálogo original, defina a propriedade FolderBrowserDialog.AutoUpgradeEnabled como false antes de mostrar a caixa de diálogo, como demonstra o seguinte fragmento de código:

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

Categoria

Windows Forms

APIs afetadas


SerializableAttribute removido de alguns tipos do Windows Forms

SerializableAttribute foi removido de algumas classes do Windows Forms que não têm cenários de serialização binária conhecidos.

Descrição das alterações

Os seguintes tipos recebem o SerializableAttribute no .NET Framework, mas o atributo foi removido no .NET Core:

Historicamente, esse mecanismo de serialização tem apresentado sérias preocupações de manutenção e segurança. A manutenção de SerializableAttribute significa que esses tipos precisam ser testados quanto a alterações de serialização de versão para versão e possíveis alterações de serialização de estrutura para estrutura. Isso dificulta a evolução desses tipos e pode custar caro. Esses tipos não têm cenários de serialização binária conhecidos, o que minimiza o impacto da remoção do atributo.

Para obter mais informações, confira Serialização binária.

Versão introduzida

3.0

Atualize os códigos que possam depender da marcação desses tipos como serializáveis.

Categoria

Windows Forms

APIs afetadas

  • Nenhum

Não há suporte para a opção de compatibilidade AllowUpdateChildControlIndexForTabControls

Há suporte para a opção de compatibilidade Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls no Windows Forms no .NET Framework 4.6 e nas versões posteriores, mas não no .NET Core nem no .NET 5.0 e posteriores.

Descrição das alterações

No .NET Framework 4.6 e nas versões posteriores, a seleção de uma guia reordena a respectiva coleção de controles. A opção de compatibilidade Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls permite que um aplicativo ignore essa reordenação quando esse comportamento não é desejado.

No .NET Core e no .NET 5.0 e posteriores, não há suporte para a opção Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls.

Versão introduzida

3.0

Remova a opção. Não há suporte para a opção e nenhuma funcionalidade alternativa está disponível.

Categoria

Windows Forms

APIs afetadas

  • Nenhum

Não há suporte para a opção de compatibilidade DomainUpDown.UseLegacyScrolling

A opção de compatibilidade Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling, que foi introduzida no .NET Framework 4.7.1, não é compatível com o Windows Forms no .NET Core nem no .NET 5.0 e posteriores.

Descrição das alterações

Do .NET Framework 4.7.1 em diante, a opção de compatibilidade Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling permitia que os desenvolvedores recusassem as ações DomainUpDown.DownButton() e DomainUpDown.UpButton() independentes. A opção restaurou o comportamento herdado, no qual o DomainUpDown.UpButton() é ignorado quando o texto do contexto está presente, e o desenvolvedor precisa usar a ação DomainUpDown.DownButton() no controle antes da ação DomainUpDown.UpButton(). Para obter mais informações, confira Elemento <AppContextSwitchOverrides>.

No .NET Core e no .NET 5.0 e posteriores, não há suporte para a opção Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling.

Versão introduzida

3.0

Remova a opção. Não há suporte para a opção e nenhuma funcionalidade alternativa está disponível.

Categoria

Windows Forms

APIs afetadas


Não há suporte para a opção de compatibilidade DoNotLoadLatestRichEditControl

A opção de compatibilidade Switch.System.Windows.Forms.UseLegacyImages, que foi introduzida no .NET Framework 4.7.1, não é compatível com o Windows Forms no .NET Core nem no .NET 5.0 e posteriores.

Descrição das alterações

No .NET Framework 4.6.2 e nas versões anteriores, o controle RichTextBox criava uma instância do controle RichEdit do Win32 v3.0 e, para aplicativos direcionados ao .NET Framework 4.7.1, o controle RichTextBox criava uma instância do RichEdit v4.1 (no msftedit.dll). A opção de compatibilidade Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl foi introduzida para permitir que os aplicativos direcionados ao .NET Framework versão 4.7.1 e posteriores recusassem o novo controle RichEdit v4.1 e usassem o antigo controle RichEdit v3.

No .NET Core e no .NET 5.0 e versões posteriores, não há suporte para a opção Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl. Há suporte apenas para novas versões do controle RichTextBox.

Versão introduzida

3.0

Remova a opção. Não há suporte para a opção e nenhuma funcionalidade alternativa está disponível.

Categoria

Windows Forms

APIs afetadas


Não há suporte para a opção de compatibilidade DoNotSupportSelectAllShortcutInMultilineTextBox

A opção de compatibilidade Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox, que foi introduzida no .NET Framework 4.6.1, não é compatível com o Windows Forms no .NET Core nem no .NET 5.0 e posteriores.

Descrição das alterações

Do .NET Framework 4.6.1 em diante, a seleção da tecla de atalho Ctrl + A em um controle TextBox passou a selecionar o texto todo. No .NET Framework 4.6 e nas versões anteriores, a seleção da tecla de atalho Ctrl + A não conseguia selecionar o texto todo quando as propriedades Textbox.ShortcutsEnabled e TextBox.Multiline estavam definidas como true. A opção de compatibilidade Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox foi introduzida no .NET Framework 4.6.1 para manter o comportamento original. Para obter mais informações, consulte TextBox.ProcessCmdKey.

No .NET Core e no .NET 5.0 e versões posteriores, não há suporte para a opção Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox.

Versão introduzida

3.0

Remova a opção. Não há suporte para a opção e nenhuma funcionalidade alternativa está disponível.

Categoria

Windows Forms

APIs afetadas

  • Nenhum

Não há suporte para a opção de compatibilidade DontSupportReentrantFilterMessage

A opção de compatibilidade Switch.System.Windows.Forms.DontSupportReentrantFilterMessage, que foi introduzida no .NET Framework 4.6.1, não é compatível com o Windows Forms no .NET Core nem no .NET 5.0 e posteriores.

Descrição das alterações

Do .NET Framework 4.6.1 em diante, a opção de compatibilidade Switch.System.Windows.Forms.DontSupportReentrantFilterMessage trata possíveis exceções de IndexOutOfRangeException quando a mensagem Application.FilterMessage é chamada com uma implementação personalizada de IMessageFilter.PreFilterMessage. Para saber mais, confira Mitigation: Custom IMessageFilter.PreFilterMessage Implementations (Mitigação: implementações personalizadas de IMessageFilter.PreFilterMessage).

No .NET Core e no .NET 5.0 e posteriores, não há suporte para a opção Switch.System.Windows.Forms.DontSupportReentrantFilterMessage.

Versão introduzida

3.0

Remova a opção. Não há suporte para a opção e nenhuma funcionalidade alternativa está disponível.

Categoria

Windows Forms

APIs afetadas


Não há suporte para a opção de compatibilidade EnableVisualStyleValidation

Não há suporte para a opção de compatibilidade Switch.System.Windows.Forms.EnableVisualStyleValidation no Windows Forms no .NET Core nem no .NET 5.0 e posteriores.

Descrição das alterações

No .NET Framework, a opção de compatibilidade Switch.System.Windows.Forms.EnableVisualStyleValidation permitia que um aplicativo recusasse a validação dos estilos visuais fornecidos em um formulário numérico.

No .NET Core e no .NET 5.0 e posteriores, não há suporte para a opção Switch.System.Windows.Forms.EnableVisualStyleValidation.

Versão introduzida

3.0

Remova a opção. Não há suporte para a opção e nenhuma funcionalidade alternativa está disponível.

Categoria

Windows Forms

APIs afetadas

  • Nenhum

Não há suporte para a opção de compatibilidade UseLegacyContextMenuStripSourceControlValue

A opção de compatibilidade Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue, que foi introduzida no .NET Framework 4.7.2, não é compatível com o Windows Forms no .NET Core nem no .NET 5.0 e posteriores.

Descrição das alterações

Do .NET Framework 4.7.2 em diante, a opção de compatibilidade Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue permite que o desenvolvedor recuse o novo comportamento da propriedade ContextMenuStrip.SourceControl, que agora retorna uma referência ao controle do código-fonte. O comportamento anterior da propriedade retornava null. Para obter mais informações, confira Elemento <AppContextSwitchOverrides>.

No .NET Core e no .NET 5.0 e posteriores, não há suporte para a opção Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue.

Versão introduzida

3.0

Remova a opção. Não há suporte para a opção e nenhuma funcionalidade alternativa está disponível.

Categoria

Windows Forms

APIs afetadas


Não há suporte para a opção de compatibilidade UseLegacyImages

A opção de compatibilidade Switch.System.Windows.Forms.UseLegacyImages, que foi introduzida no .NET Framework 4.8, não é compatível com o Windows Forms no .NET Core nem no .NET 5.0 e posteriores.

Descrição das alterações

Do .NET Framework 4.8, a opção de compatibilidade Switch.System.Windows.Forms.UseLegacyImages resolvia possíveis problemas de dimensionamento de imagem em cenários ClickOnce em ambientes de DPI alta. Quando definida como true, a opção permite que o usuário restaure o dimensionamento de imagem herdado em exibições de DPI alta cuja escala é definida como maior que 100%. Para obter mais informações, confira Notas sobre a versão do .NET Framework 4.8 no GitHub.

No .NET Core e no .NET 5.0 e posteriores, não há suporte para a opção Switch.System.Windows.Forms.UseLegacyImages.

Versão introduzida

3.0

Remova a opção. Não há suporte para a opção e nenhuma funcionalidade alternativa está disponível.

Categoria

Windows Forms

APIs afetadas

  • Nenhum

Os modelos About e SplashScreen são interrompidos

Os arquivos About.vb e SplashScreen.vb gerados pelo Visual Studio contêm referências a tipos no namespace My que não estão disponíveis no .NET Core 3.0 e 3.1.

Versão introduzida

3.0

Descrição das alterações

O .NET Core 3.0 e o 3.1 não têm suporte completo ao Visual Basic My. Os modelos de formulário About e SplashScreen nos aplicativos Visual Studio para Windows Forms do Visual Basic fazem referência a propriedades no tipo My.Application.Info que não estão disponíveis.

O suporte do Visual Basic My foi aprimorado no .NET 5. Atualize seu projeto para o .NET 5 ou versões posteriores.

-ou-

Corrija os erros do compilador nos tipos About e SplashScreen em seu aplicativo. Use a classe System.Reflection.Assembly para obter as informações fornecidas pelo tipo My.Application.Info. Uma porta reta de ambos os formulários está disponível aqui.

Dica

Este é um exemplo de código e não otimizado. A lista de atributos deve ser armazenada em cache para reduzir o tempo de carregamento do formulário.

Sobre

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

Categoria

Windows Forms do Visual Basic

APIs afetadas

Nenhum


Confira também