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:

Cambio importante Versión introducida
Controles eliminados 3.1
El evento CellFormatting no se produce si se muestra información en pantalla 3.1
Se ha cambiado Control.DefaultFont a Segoe UI 9 pt 3.0
Se ha modernizado FolderBrowserDialog 3.0
Se ha quitado SerializableAttribute de algunos tipos de Windows Forms 3.0
No se admite el modificador de compatibilidad AllowUpdateChildControlIndexForTabControls 3.0
No se admite el modificador de compatibilidad DomainUpDown.UseLegacyScrolling 3.0
No se admite el modificador de compatibilidad DoNotLoadLatestRichEditControl 3.0
No se admite el modificador de compatibilidad DoNotSupportSelectAllShortcutInMultilineTextBox 3.0
No se admite el modificador de compatibilidad DontSupportReentrantFilterMessage 3.0
No se admite el modificador de compatibilidad EnableVisualStyleValidation 3.0
No se admite el modificador de compatibilidad UseLegacyContextMenuStripSourceControlValue 3.0
No se admite el modificador de compatibilidad UseLegacyImages 3.0
Las plantillas About y SplashScreen se han roto para Visual Basic 3.0

.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:

Versión introducida

3.1

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


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

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 pt. En la imagen siguiente se muestra una ventana con la fuente predeterminada.

Default control font in .NET Framework

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:

Default control font in .NET Core

Este cambio se ha realizado a fin de adaptarse a las directrices para la experiencia de usuario de Windows.

Versión introducida

3.0

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, establezca la fuente predeterminada del formulario en Microsoft Sans Serif 8 pt. Por ejemplo:

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

Categoría

  • 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:

The FolderBrowserDialogControl in the .NET Framework

En .NET Core 3.0, Windows Forms usa un control basado en COM más reciente que se presentó en Windows Vista:

The FolderBrowserDialogControl in the .NET Core

Versión introducida

3.0

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:

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

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

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

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

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

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

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

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

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

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.

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


Vea también