Cambios importantes en Windows Forms para .NET Core 3.0 y 3.1
Se ha agregado compatibilidad con Windows Forms a .NET Core, versión 3.0. En este artículo se enumeran los cambios importantes de Windows Forms por versión de .NET en la que se han incorporado. Si está actualizando una aplicación de Windows Forms desde .NET Framework o una versión anterior de .NET Core (3.0 o posterior), este artículo se aplica a su caso.
En esta página se documentan los siguientes cambios importantes:
.NET Core 3.1
Controles eliminados
A partir de .NET Core 3.1, algunos controles de Windows Forms ya no están disponibles.
Descripción del cambio
A partir de .NET Core 3.1, varios controles de Windows Forms ya no están disponibles. Los controles de reemplazo, con un mejor diseño y soporte técnico, se introdujeron en .NET Framework 2.0. Los controles en desuso se eliminaron previamente de los cuadros de herramientas del diseñador, pero todavía estaban disponibles para su uso.
Los siguientes tipos ya no están disponibles:
- 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
Versión introducida
3.1
Acción recomendada
Cada control eliminado tiene un control de reemplazo recomendado. Consulte la tabla siguiente:
Control eliminado (API) | Reemplazo recomendado | API asociadas que se han eliminado |
---|---|---|
ContextMenu | ContextMenuStrip | |
DataGrid | DataGridView | DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType |
MainMenu | MenuStrip | |
Menú | ToolStripDropDown, ToolStripDropDownMenu | MenuItemCollection |
MenuItem | ToolStripMenuItem | |
ToolBar | ToolStrip | ToolBarAppearance |
ToolBarButton | ToolStripButton | ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign |
Categoría
Windows Forms
API afectadas
- 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
El evento CellFormatting no se produce si se muestra información en pantalla.
Ahora, DataGridView muestra información en pantalla del texto y los errores de una celda cuando se mantiene el mouse sobre ella y cuando se selecciona mediante el teclado. Si se muestra información en pantalla, no se produce el evento DataGridView.CellFormatting.
Descripción del cambio
Antes de .NET Core 3.1, un elemento DataGridView con la propiedad ShowCellToolTips establecida en true
mostraba información en pantalla del texto y los errores de una celda cuando se mantenía el mouse sobre ella. La información en pantalla no se mostraba si la celda se seleccionaba mediante el teclado (por ejemplo, mediante la tecla Tab, teclas de método abreviado o las teclas de dirección). Si el usuario editaba una celda y, luego, mientras el elemento DataGridView aún estaba en modo de edición, mantenía el mouse sobre una celda que no tenía establecida la propiedad ToolTipText, se producía un evento CellFormatting para dar formato al texto de la celda para su presentación en ella.
Para cumplir los estándares de accesibilidad, a partir de .NET Core 3.1, un elemento DataGridView que tenga la propiedad ShowCellToolTips establecida en true
muestra información en pantalla del texto y los errores de una celda no solo cuando se mantiene el mouse sobre la celda, sino también cuando se selecciona mediante el teclado. Como consecuencia de este cambio, el evento CellFormattingno se produce cuando se mantiene el mouse sobre las celdas que no tienen establecida la propiedad ToolTipText mientras DataGridView está en modo de edición. El evento no se produce porque el contenido de la celda se muestra como información en pantalla en lugar de mostrarse en la celda.
Versión introducida
3.1
Acción recomendada
Refactorice cualquier código que dependa del evento CellFormatting mientras DataGridView está en modo de edición.
Categoría
Windows Forms
API afectadas
None
.NET Core 3.0
Fuente de control predeterminada cambiada a Segoe UI 9 pt
Descripción del cambio
En .NET Framework, la propiedad Control.DefaultFont estaba establecida en Microsoft Sans Serif 8.25 pt
. En la imagen siguiente se muestra una ventana con la fuente predeterminada.
A partir de .NET Core 3.0, la fuente predeterminada está establecida en Segoe UI 9 pt
(la misma fuente que SystemFonts.MessageBoxFont). Como resultado de este cambio, los formularios y los controles tienen un tamaño aproximadamente un 27 % mayor en razón del mayor tamaño de la nueva fuente predeterminada. Por ejemplo:
Este cambio se ha realizado a fin de adaptarse a las directrices para la experiencia de usuario de Windows.
Versión introducida
3.0
Acción recomendada
Debido al cambio en el tamaño de los formularios y controles, asegúrese de que la aplicación se representa correctamente.
Para conservar la fuente original de un único formulario, establezca su fuente predeterminada en Microsoft Sans Serif 8.25 pt
. Por ejemplo:
public MyForm()
{
InitializeComponent();
Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}
O bien, puede cambiar la fuente predeterminada para una aplicación completa de cualquiera de las maneras siguientes:
Estableciendo la propiedad de MSBuild
ApplicationDefaultFont
en "Microsoft Sans Serif, 8.25pt". Esta es la técnica preferente porque permite a Visual Studio usar la nueva configuración en el diseñador.<PropertyGroup> <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont> </PropertyGroup>
Mediante una llamada a 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()); } }
Category
- Windows Forms
API afectadas
Ninguno.
Modernización de FolderBrowserDialog
El control FolderBrowserDialog ha cambiado en las aplicaciones de Windows Forms para .NET Core.
Descripción del cambio
En .NET Framework, Windows Forms utiliza el siguiente cuadro de diálogo para el control FolderBrowserDialog:
En .NET Core 3.0, Windows Forms usa un control basado en COM más reciente que se presentó en Windows Vista:
Versión introducida
3.0
Acción recomendada
El cuadro de diálogo se actualizará automáticamente.
Si quiere conservar el cuadro de diálogo original, establezca la propiedad FolderBrowserDialog.AutoUpgradeEnabled en false
antes de mostrar el cuadro de diálogo, tal y como se muestra en el siguiente fragmento de código:
var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();
Categoría
Windows Forms
API afectadas
Se ha quitado el atributo SerializableAttribute de algunos tipos de Windows Forms
El atributo SerializableAttribute se ha quitado de algunas clases de Windows Forms que no tienen ningún escenario de serialización binaria conocido.
Descripción del cambio
Los tipos siguientes se representan con el atributo SerializableAttribute en .NET Framework, pero este atributo se ha quitado en .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
Históricamente, este mecanismo de serialización ha presentado problemas graves de mantenimiento y de seguridad. Mantener el atributo SerializableAttribute
en tipos significa que se deben comprobar esos tipos por si hay cambios de serialización de una versión a otra y, posiblemente, también de un marco a otro. Esto dificulta el desarrollo de esos tipos y puede requerir un mantenimiento costoso. Estos tipos no tienen ningún escenario conocido de serialización binaria, lo cual reduce el impacto de la eliminación del atributo.
Para obtener más información, vea Serialización binaria.
Versión introducida
3.0
Acción recomendada
Actualice cualquier código que pueda depender de estos tipos que están marcados como serializables.
Categoría
Windows Forms
API afectadas
- None
No se admite el modificador de compatibilidad AllowUpdateChildControlIndexForTabControls
El modificador de compatibilidad Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
se admite en Windows Forms en .NET Framework 4.6 y versiones posteriores, pero no se admite en .NET Core ni .NET 5.0 y posterior.
Descripción del cambio
En .NET Framework 4.6 y en versiones posteriores, al seleccionar una pestaña, se reordena su colección de controles. El modificador de compatibilidad Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
permite a una aplicación omitir esta reordenación cuando no se desea este comportamiento.
En .NET Core y .NET 5.0 y posterior no se admite el modificador Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
.
Versión introducida
3.0
Acción recomendada
Quite el modificador. No se admite el modificador y no hay ninguna funcionalidad alternativa disponible.
Categoría
Windows Forms
API afectadas
- None
No se admite el modificador de compatibilidad DomainUpDown.UseLegacyScrolling
El modificador de compatibilidad Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
, incorporado en .NET Framework 4.7.1, no se admite en Windows Forms en .NET Core ni .NET 5.0 y posterior.
Descripción del cambio
A partir de .NET Framework 4.7.1, el modificador de compatibilidad Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
permite a los desarrolladores rechazar las acciones independientes DomainUpDown.DownButton() y DomainUpDown.UpButton(). El modificador restaura el comportamiento heredado, en el que se rechaza la acción DomainUpDown.UpButton() si hay texto de contexto, y el desarrollador debe usar la acción DomainUpDown.DownButton() en el control antes de la acción DomainUpDown.UpButton(). Para más información, consulte el elemento <AppContextSwitchOverrides>.
En .NET Core y .NET 5.0 y posterior no se admite el modificador Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
.
Versión introducida
3.0
Acción recomendada
Quite el modificador. No se admite el modificador y no hay ninguna funcionalidad alternativa disponible.
Categoría
Windows Forms
API afectadas
No se admite el modificador de compatibilidad DoNotLoadLatestRichEditControl
El modificador de compatibilidad Switch.System.Windows.Forms.UseLegacyImages
, incorporado en .NET Framework 4.7.1, no se admite en Windows Forms en .NET Core ni .NET 5.0 y posterior.
Descripción del cambio
En .NET Framework 4.6.2 y versiones anteriores, el control RichTextBox crea una instancia del control de RichEdit v3.0 de Win32 y, en las aplicaciones que tienen como destino .NET Framework 4.7.1, el control RichTextBox crea una instancia de RichEdit v4.1 (en msftedit.dll). El modificador de compatibilidad Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl
se incorporó para permitir que las aplicaciones que tienen como destino .NET Framework 4.7.1 y versiones posteriores omitan el nuevo control RichEdit v4.1 y, en su lugar, usen el antiguo control RichEdit v3.
En .NET Core y .NET 5.0 y versiones posteriores no se admite el modificador Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl
. Solo se admiten las nuevas versiones del control RichTextBox.
Versión introducida
3.0
Acción recomendada
Quite el modificador. No se admite el modificador y no hay ninguna funcionalidad alternativa disponible.
Categoría
Windows Forms
API afectadas
No se admite el modificador de compatibilidad DoNotSupportSelectAllShortcutInMultilineTextBox
El modificador de compatibilidad Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
, incorporado en .NET Framework 4.6.1, no se admite en Windows Forms en .NET Core ni .NET 5.0 y posterior.
Descripción del cambio
A partir de .NET Framework 4.6.1, al seleccionar la tecla de método abreviado Ctrl + A en un control TextBox, se selecciona todo el texto. En .NET Framework 4.6 y en versiones anteriores, al seleccionar la tecla de método abreviado Ctrl + A, no se podía seleccionar todo el texto si las propiedades Textbox.ShortcutsEnabled y TextBox.Multiline estaban establecidas en true
. El modificador de compatibilidad Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
se introdujo en .NET Framework 4.6.1 para conservar el comportamiento original. Para obtener más información, vea TextBox.ProcessCmdKey.
En .NET Core y .NET 5.0 y versiones posteriores no se admite el modificador Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
.
Versión introducida
3.0
Acción recomendada
Quite el modificador. No se admite el modificador y no hay ninguna funcionalidad alternativa disponible.
Categoría
Windows Forms
API afectadas
- None
No se admite el modificador de compatibilidad DontSupportReentrantFilterMessage
El modificador de compatibilidad Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
, incorporado en .NET Framework 4.6.1, no se admite en Windows Forms en .NET Core ni .NET 5.0 y posterior.
Descripción del cambio
A partir de .NET Framework 4.6.1, el modificador de compatibilidad Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
soluciona las posibles excepciones IndexOutOfRangeException cuando se llama al mensaje Application.FilterMessage con una implementación personalizada de IMessageFilter.PreFilterMessage. Para más información, consulte Mitigación: personalizar implementaciones de IMessageFilter.PreFilterMessage.
En .NET Core y .NET 5.0 y posterior no se admite el modificador Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
.
Versión introducida
3.0
Acción recomendada
Quite el modificador. No se admite el modificador y no hay ninguna funcionalidad alternativa disponible.
Categoría
Windows Forms
API afectadas
No se admite el modificador de compatibilidad EnableVisualStyleValidation
El modificador de compatibilidad Switch.System.Windows.Forms.EnableVisualStyleValidation
no se admite en Windows Forms en .NET Core ni .NET 5.0 y posterior.
Descripción del cambio
En .NET Framework, el modificador de compatibilidad Switch.System.Windows.Forms.EnableVisualStyleValidation
permitía que una aplicación rechazara la validación de los estilos visuales proporcionados en un formato numérico.
En .NET Core y .NET 5.0 y posterior no se admite el modificador Switch.System.Windows.Forms.EnableVisualStyleValidation
.
Versión introducida
3.0
Acción recomendada
Quite el modificador. No se admite el modificador y no hay ninguna funcionalidad alternativa disponible.
Categoría
Windows Forms
API afectadas
- None
No se admite el modificador de compatibilidad UseLegacyContextMenuStripSourceControlValue
El modificador de compatibilidad Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
, incorporado en .NET Framework 4.7.2, no se admite en Windows Forms en .NET Core ni .NET 5.0 y posterior.
Descripción del cambio
A partir de .NET Framework 4.7.2, el modificador de compatibilidad Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
permite al desarrollador omitir el nuevo comportamiento de la propiedad ContextMenuStrip.SourceControl, que ahora devuelve una referencia al control de código fuente. El comportamiento anterior de la propiedad era devolver null
. Para más información, consulte el elemento <AppContextSwitchOverrides>.
En .NET Core y .NET 5.0 y posterior no se admite el modificador Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
.
Versión introducida
3.0
Acción recomendada
Quite el modificador. No se admite el modificador y no hay ninguna funcionalidad alternativa disponible.
Categoría
Windows Forms
API afectadas
No se admite el modificador de compatibilidad UseLegacyImages
El modificador de compatibilidad Switch.System.Windows.Forms.UseLegacyImages
, incorporado en .NET Framework 4.8, no se admite en Windows Forms en .NET Core ni .NET 5.0 y posterior.
Descripción del cambio
A partir de .NET Framework 4.8, el modificador de compatibilidad Switch.System.Windows.Forms.UseLegacyImages
soluciona posibles problemas de escalado de imágenes en escenarios de ClickOnce en entornos con valores altos de PPP. Cuando se establece en true
, el modificador permite al usuario restaurar el escalado de imágenes heredadas en pantallas con valores altos de PPP cuya escala está establecida en un valor mayor que 100 %. Para obtener más información, consulte Notas de la versión de .NET Framework 4.8 en GitHub.
En .NET Core y .NET 5.0 y posterior no se admite el modificador Switch.System.Windows.Forms.UseLegacyImages
.
Versión introducida
3.0
Acción recomendada
Quite el modificador. No se admite el modificador y no hay ninguna funcionalidad alternativa disponible.
Categoría
Windows Forms
API afectadas
- None
Las plantillas About y SplashScreen están rotas
Los archivos About.vb
y SplashScreen.vb
generados por Visual Studio contienen referencias a tipos en el espacio de nombres My
que no están disponibles en .NET Core 3.0 y 3.1.
Versión introducida
3.0
Descripción del cambio
.NET Core 3.0 y 3.1 no contienen compatibilidad con Visual Basic My
completa. Las plantillas de formulario About y SplashScreen de Visual Studio para aplicaciones de Windows Forms de Visual Basic hacen referencia a propiedades del tipo My.Application.Info
que no están disponibles.
Acción recomendada
La compatibilidad con Visual Basic My
se mejoró en .NET 5; actualice el proyecto a .NET 5 o versiones posteriores.
O bien
Corrija los errores del compilador en los tipos About y SplashScreen de la aplicación. Use la clase System.Reflection.Assembly
para obtener la información proporcionada por el tipo My.Application.Info
. Aquí hay disponible un puerto directo de ambos formularios.
Sugerencia
Se trata de código de ejemplo y no está optimizado. La lista de atributos debe almacenarse en caché para reducir el tiempo de carga del formulario.
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
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
Category
Windows Forms de Visual Basic
API afectadas
None