Partilhar via


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

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

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

Quebrando a mudança Versão introduzida
Controles removidos 3.1
evento CellFormatting não é disparado se a dica de ferramenta for mostrada 3.1
Control.DefaultFont alterado para Segoe UI 9 pt 3.0
Modernização do diálogo de seleção de pastas 3.0
SerializableAttribute removido de alguns tipos de Windows Forms 3.0
Opção de compatibilidade AllowUpdateChildControlIndexForTabControls não é suportada 3.0
A opção de compatibilidade "DomainUpDown.UseLegacyScrolling" não é suportada 3.0
opção de compatibilidade DoNotLoadLatestRichEditControl não é suportada 3.0
opção de compatibilidade DoNotSupportSelectAllShortcutInMultilineTextBox não é suportada 3.0
opção de compatibilidade DontSupportReentrantFilterMessage não é suportada 3.0
A alternativa de compatibilidade EnableVisualStyleValidation não é suportada 3.0
opção de compatibilidade UseLegacyContextMenuStripSourceControlValue não suportada 3.0
opção de compatibilidade UseLegacyImages não é suportada 3.0
modelos Sobre e SplashScreen estão quebrados para 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.

Alterar descrição

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 melhor design e suporte foram introduzidos no .NET Framework 2.0. Os controles preteridos foram removidos anteriormente 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 controlo removido tem um controlo de substituição recomendado. Consulte a tabela a seguir:

Controle removido (API) Substituição recomendada APIs associadas que são removidas
Menu de contexto ContextMenuStrip
DataGrid DataGridView DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
Menu principal Barra de Menu
Menu ToolStripDropDown, ToolStripDropDownMenu MenuItemCollection
Item de Menu ToolStripMenuItem
Barra de ferramentas Barra de Ferramentas Aparência da Barra de Ferramentas
Botão da Barra de Ferramentas Botão de Barra de Ferramentas ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Categoria

Formulários do Windows

APIs afetadas


Evento Formatação de Célula não é acionado se a dica de ferramenta for mostrada

Uma DataGridView agora mostra as dicas de texto e de erro de uma célula quando pressionada por um mouse e quando selecionada através do teclado. Se uma dica de ferramenta for mostrada, o evento DataGridView.CellFormatting não será gerado.

Alterar descrição

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

Para atender aos padrões de acessibilidade, a partir do .NET Core 3.1, um DataGridView que tem a propriedade ShowCellToolTips definida como true mostra dicas de ferramentas para o texto e erros de uma célula não apenas quando a célula está com o cursor do rato sobre, mas também quando é selecionada pelo teclado. Como consequência dessa alteração, o evento CellFormattingnão é gerado quando as células que não têm a propriedade ToolTipText definida são passadas com o cursor enquanto o 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

Refatore qualquer código que dependa do evento CellFormatting enquanto o DataGridView estiver no modo de edição.

Categoria

Formulários do Windows

APIs afetadas

Nenhum


.NET Core 3.0

Fonte de controle padrão alterada para Segoe UI 9 pt

Alterar descrição

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

A partir do .NET Core 3.0, 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 controles são dimensionados cerca de 27% maiores para levar em conta 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 com diretrizes de experiência do usuário (UX) do Windows.

Versão introduzida

3.0

Devido à alteração no tamanho dos formulários e controles, certifique-se de que seu aplicativo seja renderizado corretamente.

Para manter a fonte original para 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 para 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>
    
  • Ao chamar 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

  • Formulários do Windows

APIs afetadas

Nenhuma.


Modernização do FolderBrowserDialog

O controle FolderBrowserDialog foi alterado em aplicativos Windows Forms para .NET Core.

Alterar descrição

No .NET Framework, os Formulários do Windows usam a seguinte caixa de diálogo para o controlo FolderBrowserDialog:

o FolderBrowserDialogControl no .NET Framework

No .NET Core 3.0, o Windows Forms usa um controle baseado em COM mais recente 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 desejar manter a caixa de diálogo original, defina a propriedade FolderBrowserDialog.AutoUpgradeEnabled como false antes de mostrar a caixa de diálogo, conforme ilustrado pelo seguinte fragmento de código:

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

Categoria

Formulários do Windows

APIs afetadas


SerializableAttribute removido de alguns tipos de Windows Forms

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

Alterar descrição

Os seguintes tipos são decorados com o SerializableAttribute no .NET Framework, mas o atributo foi removido no .NET Core:

Historicamente, esse mecanismo de serialização tem tido sérias preocupações de manutenção e segurança. Manter SerializableAttribute em tipos significa que esses tipos devem ser testados para alterações de serialização de versão para versão e, potencialmente, de plataforma para plataforma. Isso dificulta a evolução desses tipos e pode ser caro para manter. 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, consulte Serialização binária.

Versão introduzida

3.0

Atualize qualquer código que possa depender de esses tipos serem marcados como serializáveis.

Categoria

Formulários do Windows

APIs afetadas

  • Nenhum

Opção de compatibilidade AllowUpdateChildControlIndexForTabControls não suportada

A opção de compatibilidade Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls é suportada no Windows Forms no .NET Framework 4.6 e versões posteriores, mas não é suportada no .NET Core ou .NET 5.0 e posterior.

Alterar descrição

No .NET Framework 4.6 e versões posteriores, selecionar uma guia reordena sua coleção de controle. A opção de compatibilidade Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls permite que um aplicativo ignore essa reordenação quando esse comportamento é indesejável.

No .NET Core e .NET 5.0 e posterior, a opção Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas

  • Nenhum

A opção de compatibilidade DomainUpDown.UseLegacyScrolling não é suportada

A opção de compatibilidade Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling, que foi introduzida no .NET Framework 4.7.1, não tem suporte para Windows Forms no .NET Core ou em versões .NET 5.0 e superiores.

Alterar descrição

A partir do .NET Framework 4.7.1, a opção de compatibilidade Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling permitiu que os desenvolvedores optassem por não usar ações independentes DomainUpDown.DownButton() e DomainUpDown.UpButton(). O interruptor restaurou o comportamento herdado, no qual o DomainUpDown.UpButton() é ignorado se o texto de contexto estiver presente, e o desenvolvedor é obrigado a usar a ação DomainUpDown.DownButton() no controlo antes da ação DomainUpDown.UpButton(). Para obter mais informações, consulte o elemento <AppContextSwitchOverrides>.

No .NET Core e .NET 5.0 e posterior, a opção Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas


Opção de compatibilidade DoNotLoadLatestRichEditControl não suportada

A opção de compatibilidade Switch.System.Windows.Forms.UseLegacyImages, que foi introduzida no .NET Framework 4.7.1, não é suportada no Windows Forms no .NET Core ou .NET 5.0 e posterior.

Alterar descrição

No .NET Framework 4.6.2 e versões anteriores, o controle RichTextBox instancia o controle Win32 RichEdit v3.0 e, para aplicativos destinados ao .NET Framework 4.7.1, o controle RichTextBox instancia o RichEdit v4.1 (em msftedit.dll). A opção de compatibilidade Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl foi introduzida para permitir que os aplicativos destinados ao .NET Framework 4.7.1 e versões posteriores desativem o novo controle RichEdit v4.1 e usem o antigo controle RichEdit v3.

No .NET Core e .NET 5.0 e versões posteriores, a opção Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl não é suportada. Somente novas versões do controle RichTextBox são suportadas.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas


Opção de compatibilidade DoNotSupportSelectAllShortcutInMultilineTextBox não suportada

A opção de compatibilidade Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox, que foi introduzida no .NET Framework 4.6.1, não é suportada no Windows Forms no .NET Core e .NET 5.0 e posterior.

Alterar descrição

A partir do .NET Framework 4.6.1, selecionar a tecla de atalho Ctrl + A num controlo TextBox selecionou todo o texto. No .NET Framework 4.6 e em versões anteriores, ao selecionar a tecla de atalho Ctrl + , não era possível selecionar todo o texto se as propriedades Textbox.ShortcutsEnabled e TextBox.Multiline estivessem ambas 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 .NET 5.0 e versões posteriores, a opção Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas

  • Nenhum

O interruptor de compatibilidade DontSupportReentrantFilterMessage não é suportado

A opção de compatibilidade Switch.System.Windows.Forms.DontSupportReentrantFilterMessage, que foi introduzida no .NET Framework 4.6.1, não é suportada no Windows Forms no .NET Core e .NET 5.0 e versões posteriores.

Alterar descrição

A partir do .NET Framework 4.6.1, o interruptor de compatibilidade Switch.System.Windows.Forms.DontSupportReentrantFilterMessage aborda possíveis exceções IndexOutOfRangeException quando a mensagem Application.FilterMessage for invocada com uma implementação IMessageFilter.PreFilterMessage personalizada. Para obter mais informações, consulte Mitigation: Custom IMessageFilter.PreFilterMessage Implementations.

No .NET Core e .NET 5.0 e posterior, a opção Switch.System.Windows.Forms.DontSupportReentrantFilterMessage não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas


Opção de compatibilidade EnableVisualStyleValidation não suportada

O interruptor de compatibilidade Switch.System.Windows.Forms.EnableVisualStyleValidation não é suportado no Windows Forms no .NET Core ou .NET 5.0 e posterior.

Alterar descrição

No .NET Framework, a opção de compatibilidade Switch.System.Windows.Forms.EnableVisualStyleValidation permitiu que um aplicativo optasse por não validar estilos visuais fornecidos em um formulário numérico.

No .NET Core e .NET 5.0 e posterior, a opção Switch.System.Windows.Forms.EnableVisualStyleValidation não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas

  • Nenhum

UseLegacyContextMenuStripSourceControlValue opção de compatibilidade não suportada

A opção de compatibilidade Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue, que foi introduzida no .NET Framework 4.7.2, não é suportada no Windows Forms no .NET Core ou .NET 5.0 e posterior.

Alterar descrição

A partir do .NET Framework 4.7.2, a opção de compatibilidade Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue permite que o desenvolvedor desative o novo comportamento da propriedade ContextMenuStrip.SourceControl, que agora retorna uma referência ao controle do código-fonte. O comportamento anterior da propriedade era retornar null. Para obter mais informações, consulte o elemento <AppContextSwitchOverrides>.

No .NET Core e .NET 5.0 e posterior, a opção Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas


A opção de compatibilidade UseLegacyImages não é suportada

A opção de compatibilidade Switch.System.Windows.Forms.UseLegacyImages, que foi introduzida no .NET Framework 4.8, não é suportada no Windows Forms no .NET Core ou no .NET 5.0 e versões posteriores.

Alterar descrição

A partir do .NET Framework 4.8, a opção de compatibilidade Switch.System.Windows.Forms.UseLegacyImages resolveu possíveis problemas de dimensionamento de imagem em cenários ClickOnce em ambientes de alto DPI. Quando definido como true, o switch permite que o usuário restaure o dimensionamento de imagem herdado em monitores de DPI alto cuja escala é definida como superior a 100%. Para obter mais informações, consulte Notas de versão do .NET Framework 4.8 no GitHub.

No .NET Core e .NET 5.0 e posterior, a opção Switch.System.Windows.Forms.UseLegacyImages não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas

  • Nenhum

Sobre e SplashScreen templates estão quebrados

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 .NET Core 3.0 e 3.1.

Versão introduzida

3.0

Alterar descrição

O .NET Core 3.0 e 3.1 não contêm suporte completo ao Visual Basic My. Os modelos de formulário Sobre e SplashScreen no Visual Studio para aplicações Windows Forms em Visual Basic referenciam propriedades no tipo My.Application.Info que não estão disponíveis.

O suporte ao Visual Basic My foi melhorado no .NET 5, atualize seu projeto para o .NET 5 ou posterior.

-ou-

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

Dica

Este é um código de exemplo 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

Visual Basic Windows Forms

APIs afetadas

Nenhum


Ver também