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 estão documentadas nesta página:

Quebrando a mudança Versão introduzida
Controles removidos 3.1
Evento CellFormatting não gerado se a dica de ferramenta for mostrada 3.1
Control.DefaultFont alterado para Segoe UI 9 pt 3.0
Modernização do FolderBrowserDialog 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
Opção de compatibilidade EnableVisualStyleValidation não suportada 3.0
UseLegacyContextMenuStripSourceControlValue opção de compatibilidade não suportada 3.0
A opção de compatibilidade UseLegacyImages não é suportada 3.0
Sobre e modelos 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 a 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. Veja a seguinte tabela:

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

Categoria

Windows Forms

APIs afetadas


Evento CellFormatting não gerado se a dica de ferramenta for mostrada

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

Alterar a descrição

Antes do .NET Core 3.1, um DataGridView que tinha a ShowCellToolTips propriedade definida para true mostrar 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 uma célula era selecionada através do 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 a DataGridView ainda estava no modo de edição, passou o mouse sobre uma célula que não tinha a ToolTipText propriedade definida, um CellFormatting evento 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 ShowCellToolTips propriedade definida para true mostrar dicas de ferramentas para o texto de uma célula e erros não apenas quando a célula é focalizada, mas também quando é selecionada através do teclado. Como consequência dessa alteração, o evento não é gerado quando as CellFormatting células que não têm a ToolTipText propriedade definida são pairadas 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 CellFormatting evento enquanto o DataGridView está no modo de edição.

Categoria

Windows Forms

APIs afetadas

Nenhuma


.NET Core 3.0

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

Alterar a descrição

No .NET Framework, a Control.DefaultFont propriedade 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 dar conta do 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 as 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 ApplicationDefaultFont propriedade 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>
    
  • Ligando para 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 FolderBrowserDialog controle foi alterado em aplicativos Windows Forms para .NET Core.

Alterar a descrição

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

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 FolderBrowserDialog.AutoUpgradeEnabled propriedade como false antes de mostrá-la, conforme ilustrado pelo seguinte fragmento de código:

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

Categoria

Windows Forms

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 a 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, alterações de serialização de estrutura para estrutura. 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

Windows Forms

APIs afetadas

  • Nenhuma

Opção de compatibilidade AllowUpdateChildControlIndexForTabControls não suportada

A Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls opção de compatibilidade é 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 a descrição

No .NET Framework 4.6 e versões posteriores, selecionar uma guia reordena sua coleção de controle. A Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls opção de compatibilidade 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 não é suportada Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls .

Versão introduzida

3.0

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

Categoria

Windows Forms

APIs afetadas

  • Nenhuma

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

A Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling opção de compatibilidade, 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 a descrição

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

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

Versão introduzida

3.0

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

Categoria

Windows Forms

APIs afetadas


Opção de compatibilidade DoNotLoadLatestRichEditControl não suportada

A Switch.System.Windows.Forms.UseLegacyImages opção de compatibilidade, 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 a descrição

No .NET Framework 4.6.2 e versões anteriores, o RichTextBox controle instancia o controle Win32 RichEdit v3.0 e, para aplicativos destinados ao .NET Framework 4.7.1, o controle instancia o RichTextBox RichEdit v4.1 (em msftedit.dll). A Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl opção de compatibilidade 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, o switch não é suportado Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl . Somente novas versões do RichTextBox controle são suportadas.

Versão introduzida

3.0

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

Categoria

Windows Forms

APIs afetadas


Opção de compatibilidade DoNotSupportSelectAllShortcutInMultilineTextBox não suportada

A Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox opção de compatibilidade, 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 a descrição

A partir do .NET Framework 4.6.1, selecionar a tecla de atalho Ctrl + A em um TextBox controle selecionou todo o texto. No .NET Framework 4.6 e em versões anteriores, a seleção da tecla de atalho Ctrl + A não conseguiu selecionar todo o texto se as propriedades Textbox.ShortcutsEnabled e TextBox.Multiline estiverem definidas como .true A Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox opção de compatibilidade foi introduzida no .NET Framework 4.6.1 para manter o comportamento original. Para obter mais informações, veja TextBox.ProcessCmdKey.

No .NET Core e .NET 5.0 e versões posteriores, o switch não é suportado Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox .

Versão introduzida

3.0

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

Categoria

Windows Forms

APIs afetadas

  • Nenhuma

Opção de compatibilidade DontSupportReentrantFilterMessage não suportada

A Switch.System.Windows.Forms.DontSupportReentrantFilterMessage opção de compatibilidade, 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 a descrição

A partir do .NET Framework 4.6.1, a opção de Switch.System.Windows.Forms.DontSupportReentrantFilterMessage compatibilidade aborda possíveis IndexOutOfRangeException exceções quando a Application.FilterMessage mensagem é chamada com uma implementação personalizada IMessageFilter.PreFilterMessage . Para obter mais informações, consulte Mitigação: implementações personalizadas de IMessageFilter.PreFilterMessage.

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

Versão introduzida

3.0

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

Categoria

Windows Forms

APIs afetadas


Opção de compatibilidade EnableVisualStyleValidation não suportada

A Switch.System.Windows.Forms.EnableVisualStyleValidation opção de compatibilidade não é suportada no Windows Forms no .NET Core ou .NET 5.0 e posterior.

Alterar a descrição

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

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

Versão introduzida

3.0

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

Categoria

Windows Forms

APIs afetadas

  • Nenhuma

UseLegacyContextMenuStripSourceControlValue opção de compatibilidade não suportada

A Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue opção de compatibilidade, 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 a descrição

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

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

Versão introduzida

3.0

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

Categoria

Windows Forms

APIs afetadas


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

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

Alterar a descrição

A partir do .NET Framework 4.8, a opção de Switch.System.Windows.Forms.UseLegacyImages compatibilidade 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 alto DPI cuja escala é definida para mais de 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 não é suportada Switch.System.Windows.Forms.UseLegacyImages .

Versão introduzida

3.0

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

Categoria

Windows Forms

APIs afetadas

  • Nenhuma

Sobre e os modelos SplashScreen estão quebrados

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

Versão introduzida

3.0

Alterar a 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 aplicativos Windows Forms Visual Basic referenciam propriedades no My.Application.Info tipo que não estão disponíveis.

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

-or-

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

Gorjeta

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.

Acerca de

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

Ecrã Inicial

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


Consulte também