Compartir a través de


Novedades de Windows Forms para .NET 9

En este artículo se describen las novedades de Windows Forms para .NET 9.

Formularios asincrónicos

Importante

Este conjunto de características es experimental, excepto para Control.InvokeAsync.

Las aplicaciones modernas requieren modelos de comunicación asincrónicos. A medida que Windows Forms ha crecido en .NET, más componentes requieren serialización de referencias a un async método para ejecutarse en el subproceso de la interfaz de usuario. Por ejemplo, controles como WebView2, api nativas de Windows 10 y Windows 11 o bibliotecas asincrónicas modernas como kernel semántico. Otro escenario sería donde va a compartir viewModels de MVVM compilados con async Windows Forms desde otras pilas de interfaz de usuario, como WPF, WinUI o .NET MAUI.

A continuación se muestra una lista de nuevos métodos agregados para admitir escenarios asincrónicos:

Esta API se protege detrás de un error del compilador porque es experimental. Para suprimir el error y habilitar el acceso a la API, agregue lo siguiente PropertyGroup al archivo del proyecto:

<PropertyGroup>
    <NoWarn>$(NoWarn);WFO5002</NoWarn>
</PropertyGroup>

Sugerencia

Para obtener más información sobre cómo suprimir esta regla, consulte Error del compilador WFO5002.

BinaryFormatter ya no se admite

BinaryFormatter se considera no seguro porque es vulnerable a ataques de deserialización, lo que puede provocar denegación de servicio (DoS), divulgación de información o ejecución remota de código. Se implementó antes de que se entendieran bien las vulnerabilidades de deserialización y su diseño no sigue los procedimientos recomendados de seguridad modernos.

A partir de .NET 9, se ha quitado su implementación para evitar estos riesgos de seguridad. Cuando BinaryFormatter se usa, se produce la PlatformNotSupportedException excepción.

Formularios Windows Forms usados BinaryFormatter en muchos escenarios, como al serializar datos para operaciones de portapapeles y arrastrar y colocar, y lo más importante es el Diseñador de Windows Forms. Internamente, Windows Forms sigue usando un subconjunto más seguro de BinaryFormatter para controlar casos de uso específicos con un conjunto conocido de tipos.

Windows Forms para .NET 9 se envía con analizadores que le ayudan a identificar los tiempos que no sabe participar en la serialización binaria.

Para obtener más información sobre BinaryFormatter, vea guía de migración de Windows Forms para BinaryFormatter.

Modo oscuro

Importante

Este conjunto de características es experimental.

Se ha agregado compatibilidad preliminar para el modo oscuro a Windows Forms, con el objetivo de finalizar la compatibilidad con .NET 10. Cuando cambia el modo de color, SystemColors se cambia para que coincida. El modo de color de la aplicación se puede establecer en uno de los siguientes valores:

  • SystemColorMode.Classic—(valor predeterminado) Modo claro, igual que las versiones anteriores de Windows Forms.
  • SystemColorMode.System—Respeta el modo claro o oscuro establecido por Windows.
  • SystemColorMode.Dark—Use el modo oscuro.

Para aplicar un modo de color, llame al Application.SetColorMode(SystemColorMode) código de inicio del programa:

namespace MyExampleProject;

static class Program
{
    /// <summary>
    ///  The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        // To customize application configuration such as set high DPI settings or default font,
        // see https://aka.ms/applicationconfiguration.
        ApplicationConfiguration.Initialize();
        Application.SetColorMode(SystemColorMode.Dark);
        Application.Run(new Form1());
    }    
}
Friend Module Program

    <STAThread()>
    Friend Sub Main(args As String())
        Application.SetHighDpiMode(HighDpiMode.SystemAware)
        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)
        Application.SetColorMode(SystemColorMode.Dark)
        Application.Run(New Form1)
    End Sub

End Module

Esta API se protege detrás de un error del compilador porque es experimental. Para suprimir el error y habilitar el acceso a la API, agregue lo siguiente PropertyGroup al archivo del proyecto:

<PropertyGroup>
    <NoWarn>$(NoWarn);WFO5001</NoWarn>
</PropertyGroup>

Sugerencia

Para obtener más información sobre cómo suprimir esta regla, consulte Error del compilador WFO5001.

Mejoras de FolderBrowserDialog

FolderBrowserDialog ahora admite la selección de varias carpetas, que se almacenan en la SelectedPaths matriz. Para habilitar varias carpetas, establezca en Multiselecttrue.

Mejoras y características nuevas de System.Drawing

La biblioteca System.Drawing ha tenido muchas mejoras, como el ajuste de efectos GDI+, la compatibilidad con ReadOnlySpany una mejor generación de código de interoperabilidad.

System.Drawing admite efectos GDI+

La biblioteca System.Drawing ahora admite efectos de mapa de bits GDI+, como desenfoque y tono. Los efectos han sido parte de GDI+, pero no fueron expuestos a través de System.Drawing hasta ahora.

Los efectos se aplican a un Bitmap mediante una llamada al Bitmap.ApplyEffect(Effect, Rectangle) método . Proporcione el efecto y un opcional Rectangle para que el área aplique el efecto. Use Rectangle.Empty para procesar toda la imagen.

El System.Drawing.Imaging.Effects espacio de nombres contiene los efectos que puede aplicar:

System.Drawing admite Span

Se han mejorado muchos métodos que aceptan matrices para aceptar ReadOnlySpantambién . Por ejemplo, métodos como GraphicsPath.AddLines(ReadOnlySpan<Point>), Graphics.DrawLines(Pen, ReadOnlySpan<Point>)y DrawPolygon(Pen, ReadOnlySpan<Point>), aceptan una matriz o ReadOnlySpan.

Uso de CsWin32 para la interoperabilidad

Todo el código de interoperabilidad se ha reemplazado por CsWin32, un generador de origen de C# P/Invoke.

ToolStrip

Se han agregado las siguientes mejoras a los ToolStrip controles y ToolStripItem .

  • Se agregó una nueva propiedad a ToolStrip, AllowClickThrough.

    Cuando se establece en true, el control se puede interactuar con mientras el formulario no está centrado.

Cuando se lanzó .NET Core 3.1, se quitaron todos los Menucontroles relacionados, como MainMenu y MenuItem. ToolStrip y ToolStripMenuItem deben usarse en su lugar. Sin embargo, ToolStripItem, la clase base para ToolStripMenuItem, no tenía un reemplazo para el MenuItem.Select evento . Este evento se generó cuando se usa el mouse o el teclado para resaltar el elemento.

.NET 9 ha agregado ToolStripItem.SelectedChanged, que se puede usar para detectar cuándo se resalta un elemento de menú.