Compartir a través de


Novedades de Windows Forms para .NET 10

En este artículo se proporciona información general de alto nivel sobre las novedades de Windows Forms (WinForms) en .NET 10. Para obtener información detallada, consulte los anuncios de versiones. Utiliza los anuncios de lanzamiento para obtener una visión general del lanzamiento completo de .NET 10. En el resto de las secciones se resaltan algunos de los cambios más importantes en Windows Forms.

.NET 10 se publicó en noviembre de 2025.

Anuncios de versiones

Cada anuncio de versión proporciona información detallada sobre los cambios de Windows Forms para .NET 10:

Cambios en el Portapapeles

Windows Forms está distribuyendo nuevo código para la API del portapapeles. El portapapeles se ha rediseñado de forma que su código pueda compartirse con Windows Presentation Foundation (WPF). Ambas tecnologías de escritorio ahora comparten el mismo código y unifican cómo interactúan con el Portapapeles. Para obtener más información, vea Cambios en el Portapapeles de Windows Forms y DataObject en .NET 10.

.NET 9 ha dejado en desuso BinaryFormatter, que se usa en algunas operaciones con el portapapeles. Estas operaciones en el portapapeles requerían que optara por recibir el paquete de compatibilidad o que trabajara en torno a la operación. Para aliviar el problema de alejarse de BinaryFormatter, .NET 10 está dejando en desuso ciertos métodos del portapapeles para indicar que no deberían usarse. Se están agregando más métodos para ayudar a la serialización JSON con datos del portapapeles, eludiendo la necesidad de BinaryFormatter.

Formularios asincrónicos

Windows Forms tiene compatibilidad con formularios asincrónicos totalmente integrados. Además, la tarea asincrónica ahora tiene una referencia débil al formulario, lo que permite las interfaces de usuario con capacidad de respuesta al administrar varias ventanas.

Windows Forms para .NET 9 introdujo nuevos métodos para admitir la visualización de formularios y diálogos de forma asincrónica, pero en un modo de vista previa opcional en el que tenía que suprimir el error del compilador WFO5002 para usar la característica. Este error del compilador ya no se desencadena con .NET 10.

Las SIGUIENTES API ya no se consideran experimentales:

Mejoras en el diseñador personalizado

Varios tipos de UITypeEditor se han migrado desde .NET Framework, incluyendo ToolStripCollectionEditor y varios editores relacionados con el control DataGridView. Estos editores son ahora detectables por el PropertyGrid y el panel de Acciones del Diseñador de Windows Forms.

SnapLines se corrigió para diseñadores personalizados.

Modo oscuro

Windows Forms tiene compatibilidad totalmente integrada con el modo oscuro.

Windows Forms para .NET 9 introdujo el estilo visual preliminar en modo oscuro, pero en un modo de vista previa opcional donde se requería suprimir el error del compilador WFO5001 para usar la función. Esta característica ya no se protege detrás de este error del compilador a partir de .NET 10.

La Application.SetColorMode(SystemColorMode) API ya no se considera experimental.

Aclaración sobre el uso de ControlStyles ApplyThemingImplicitly

Los controles siguen el modo de color establecido para la aplicación, la oscuridad o la luz. Sin embargo, puede haber un caso en el que estés redactando y dibujando tus propios controles, pero usa controles comunes de Win32 existentes, como la barra de desplazamiento. Estos controles permanecen de color claro, a menos que decida aplicar el tema antes de que se lea la propiedad CreateParams. También puede haber un caso en el que herede un Control que ya siga la tematización y quiera evitarlo para tener pleno control del dibujo, como con un botón.

Independientemente del caso de uso, sobreescriba la propiedad Control.CreateParams y llame a SetStyle(ControlStyles.ApplyThemingImplicitly, true) (opt-in) o a SetStyle(ControlStyles.ApplyThemingImplicitly, false) (opt-out) antes de que los parámetros se lean de la clase base. No se puede establecer este estilo en el constructor. El constructor base lee la propiedad CreateParams antes de llamar a tu constructor. El siguiente fragmento de código muestra cómo participar:

public partial class CustomControl1 : Control
{
    protected override CreateParams CreateParams
    {
        get
        {
            // Set this style BEFORE base.CreateParams is created and returned.
            SetStyle(ControlStyles.ApplyThemingImplicitly, true);

            CreateParams cp = base.CreateParams;
            
            // Other logic
            return cp;
        }
    }

    // Base class constructor is going to read CreateParams property
    // before your constructor code runs.
    public CustomControl1()  
    {
        // At this point, CreateParams property is already read, you
        // can't set ApplyThemingImplicitly here.
        InitializeComponent();
    }
}
Public Class CustomControl1

    Protected Overrides ReadOnly Property CreateParams As CreateParams
        Get
            ' Set this style BEFORE base.CreateParams is created and returned.
            SetStyle(ControlStyles.ApplyThemingImplicitly, True)

            Dim cp As CreateParams = MyBase.CreateParams

            ' Other logic
            Return cp
        End Get
    End Property

    ' Base class constructor is going to read CreateParams property
    ' before your constructor code runs.
    Sub New()

        ' At this point, CreateParams property is already read, you
        ' can't set ApplyThemingImplicitly here.

        InitializeComponent()

    End Sub

End Class

Corrección de errores

Estos son algunos de los errores corregidos en Windows Forms para .NET 10:

  • Si DataGridView se encontraba en modo de edición cuando se cerró el cuadro de diálogo de hospedaje, se produciría InvalidOperationException. Se ha corregido el error que provocaba esto.
  • Error del compilador WFO1000 se ha mejorado para reducir los falsos positivos relacionados con las interfaces que derivan de IComponent.
  • Se ha corregido una regresión en la que PrinterSettings.DefaultPageSettings.Color devolvía un valor incorrecto.
  • Resolución de una pérdida de memoria en el componente MSHTML .

Accesibilidad

Mejora de la compatibilidad con el lector de pantalla de NVDA.

Limpieza de código

Se han quitado el tiempo de ejecución de .NET en desuso y las referencias de paquetes innecesarias. El estilo de código se ha limpiado para solucionar las advertencias y mejorar la calidad del código.

API de ScreenCaptureMode

Se ha introducido una nueva API para evitar que las aplicaciones de captura de pantalla (que usan la API de Windows) capturen un formulario. Esta característica es útil para proteger la información confidencial, como nombres de usuario, identificadores de usuario o contraseñas, de que se filtren.

Form.ScreenCaptureMode se establece en uno de los siguientes valores para controlar el comportamiento de captura:

  • Allow—(Valor predeterminado) Permite capturar el formulario.
  • HideContent— El formulario aparece en negro cuando se captura.
  • HideWindow— Desenfoque el formulario cuando se captura. (Requiere Windows 10 20H1 versión 2004 o posterior).

Mejoras del analizador

Los analizadores existentes se han ajustado para reducir los falsos positivos.

Se han agregado nuevos analizadores: