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:
.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:
- 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
Versão introduzida
3.1
Ação recomendada
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
- 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
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
Ação recomendada
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.
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:
Essa alteração foi feita para se alinhar com diretrizes de experiência do usuário (UX) do Windows.
Versão introduzida
3.0
Ação recomendada
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:
No .NET Core 3.0, o Windows Forms usa um controle baseado em COM mais recente que foi introduzido no Windows Vista:
Versão introduzida
3.0
Ação recomendada
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:
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
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
Ação recomendada
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
Ação recomendada
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
Ação recomendada
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
Ação recomendada
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
Ação recomendada
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
Ação recomendada
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
Ação recomendada
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
Ação recomendada
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
Ação recomendada
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.
Ação recomendada
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