Novedades de Windows Forms para .NET 7
En este artículo se describen algunas de las nuevas características y mejoras de Windows Forms en .NET 7.
Hay algunos cambios importantes que debe tener en cuenta al migrar desde .NET Framework a .NET 7. Para obtener más información, vea Cambios importantes en Windows Forms.
Mejoras de PPP elevado
Se ha mejorado la representación de un valor PPP elevado con PerMonitorV2:
Escale correctamente los controles anidados. Por ejemplo, un botón que se encuentra en un panel que, a su vez, se coloca en una página de pestañas.
Escale las propiedades Form.MaximumSize y Form.MinimumSize en función de la configuración actual de PPP por monitor para las aplicaciones que ejecutan
ApplicationHighDpiMode
establecido enPerMonitorV2
.En .NET 7, esta característica está deshabilitada de forma predeterminada y debe optar por participar para recibir este cambio. A partir de .NET 8, esta característica está habilitada de forma predeterminada y debe optar por no participar para revertir al comportamiento anterior.
Para habilitar la característica, establezca la configuración de
configProperties
en runtimeconfig.json:{ "runtimeOptions": { "tfm": "net7.0", "frameworks": [ ... ], "configProperties": { "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": true, } } }
Mejoras y correcciones de accesibilidad
Esta versión agrega mejoras adicionales a la accesibilidad, entre las que se incluyen los elementos siguientes, entre otros:
Se han solucionado muchos problemas relacionados con los anuncios que se observaban en los lectores de pantalla, lo que garantiza que la información sobre los controles sea correcta. Por ejemplo, ahora ListView anuncia correctamente cuándo se expande o se contrae un grupo.
Ahora hay más controles que proporcionan compatibilidad con Automatización de la interfaz de usuario:
Se han corregido fugas de memoria relacionadas con la ejecución de una aplicación de Windows Forms en herramientas de asistencia, como Narrador.
Las herramientas de asistencia ahora dibujan con precisión los indicadores de foco e informan de los rectángulos delimitadores correctos para los formularios anidados y algunos elementos de los controles compuestos, como DataGridView, ListView y TabControl.
El patrón de control ExpandCollapse de la interfaz de usuario de Automation se ha implementado correctamente en los controles ListView, TreeView y PropertyGrid y solo se activa para los elementos expansibles.
Varias correcciones de relación de contraste de color en los controles.
Mejoras de la visibilidad de ToolStripTextBox y ToolStripButton en temas de contraste alto.
Mejoras en el enlace de datos (versión preliminar)
Aunque Windows Forms ya tenía un motor de enlace eficaz, se introduce una forma más moderna de enlace de datos, similar al que proporciona WPF.
Las nuevas características de enlace de datos permiten adoptar completamente el patrón Modelo-Vista-Modelo de vista y el uso de asignadores relacionales de objetos de Modelos de vista en Windows Forms más fácil que antes. Esto, a su vez, permite reducir el código en los archivos de código subyacente y abre nuevas posibilidades de prueba. Lo más importante es que permite el uso compartido de código entre Windows Forms y otros marcos GUI de .NET, como WPF, UWP/WinUI y .NET MAUI. Asimismo, para aclarar una pregunta frecuente, no está planeado introducir XAML en Windows Forms.
Estas nuevas características de enlace de datos están en versión preliminar para .NET 7 y se realizará más trabajo con esta característica en .NET 8.
Para habilitar el nuevo enlace, agregue la configuración EnablePreviewFeatures
al archivo del proyecto. Esto se admite tanto en C# como en Visual Basic.
<Project Sdk="Microsoft.NET.Sdk">
<!-- other settings -->
<PropertyGroup>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
</Project>
En el fragmento de código siguiente se muestran las propiedades, los eventos y los métodos nuevos que se han agregado a las distintas clases de Windows Forms. Aunque el ejemplo de código siguiente está en C#, también se aplica a Visual Basic.
public class Control {
[BindableAttribute(true)]
public virtual object DataContext { get; set; }
[BrowsableAttribute(true)]
public event EventHandler DataContextChanged;
protected virtual void OnDataContextChanged(EventArgs e);
protected virtual void OnParentDataContextChanged(EventArgs e);
}
[RequiresPreviewFeaturesAttribute]
public abstract class BindableComponent : Component, IBindableComponent, IComponent, IDisposable {
protected BindableComponent();
public BindingContext? BindingContext { get; set; }
public ControlBindingsCollection DataBindings { get; }
public event EventHandler BindingContextChanged;
protected virtual void OnBindingContextChanged(EventArgs e);
}
public abstract class ButtonBase : Control {
[BindableAttribute(true)]
[RequiresPreviewFeaturesAttribute]
public ICommand? Command { get; set; }
[BindableAttribute(true)]
public object? CommandParameter { [RequiresPreviewFeaturesAttribute] get; [RequiresPreviewFeaturesAttribute] set; }
[RequiresPreviewFeaturesAttribute]
public event EventHandler? CommandCanExecuteChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler? CommandChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler? CommandParameterChanged;
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandCanExecuteChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandParameterChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnRequestCommandExecute(EventArgs e);
}
public abstract class ToolStripItem : BindableComponent, IComponent, IDisposable, IDropTarget {
[BindableAttribute(true)]
[RequiresPreviewFeaturesAttribute]
public ICommand Command { get; set; }
[BindableAttribute(true)]
public object CommandParameter { [RequiresPreviewFeaturesAttribute] get; [RequiresPreviewFeaturesAttribute] set; }
[RequiresPreviewFeaturesAttribute]
public event EventHandler CommandCanExecuteChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler CommandChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler CommandParameterChanged;
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandCanExecuteChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandParameterChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnRequestCommandExecute(EventArgs e);
}
Otras mejoras
Estos son otros cambios importantes:
- El control de arrastrar y colocar coincide con la funcionalidad arrastrar y colocar de Windows con efectos de visualización más completos, como iconos y etiquetas de texto.
- Los cuadros de diálogo de carpeta y archivo permiten más opciones:
- Agregar a recientes
- Comprobar acceso de escritura
- Modo expandido
- Aceptar requiere interacción
- Seleccionar solo lectura
- Mostrar archivos ocultos
- Mostrar lugares anclados
- Consulta de la vista previa
- ErrorProvider ahora tiene una propiedad HasErrors.
- El diseño de acoplamiento del formulario se ha corregido para Windows 11.
Vea también
.NET Desktop feedback