Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se proporciona información general de alto nivel sobre las novedades de Windows Forms (WinForms) en la versión preliminar de .NET 11. Para obtener información detallada, consulte Anuncios de lanzamiento. Usa los anuncios de lanzamiento para tener una visión general de toda la versión de .NET 11. En el resto de este artículo se resaltan los cambios más importantes en Windows Forms.
.NET 11 Preview 7 se publicó en agosto de 2026.
Anuncios de versiones
Cada anuncio de versión proporciona información detallada sobre los cambios de Windows Forms para .NET 11:
- .NET 11 Preview 7
- .NET 11 Preview 6
- .NET 11 Preview 5
- .NET 11 preview 4
- .NET 11 Preview 3
- .NET 11 Preview 2
- .NET 11 versión preliminar 1
Estilos visuales y apariencia
System.Windows.Forms.Application.SetDefaultVisualStylesMode y la nueva propiedad System.Windows.Forms.Control.VisualStylesMode permiten activar una canalización de renderizado renovada a nivel de aplicación y de control. Elija entre el renderizador clásico (VisualStylesMode.Classic), los estilos visuales completamente desactivados (VisualStylesMode.Disabled) y el renderizador moderno (VisualStylesMode.Net11).
VisualStylesMode.Latest siempre se resuelve en el modo más reciente que admite el entorno de ejecución. Los controles secundarios tienen por defecto el valor VisualStylesMode.Inherit, por lo que la configuración se aplica en cascada de los controles principales a los secundarios.
El Net11 modo aporta la representación modernizada para Button, , CheckBoxRadioButton, GroupBox, TextBoxy RichTextBox. La FlatStyle propiedad en botones y casillas, y la BorderStyle propiedad en cuadros de texto, definen el estilo de representación. La cuadrícula de propiedades expone ahora la Padding propiedad en cuadros de texto y cuadros de texto enriquecidos y la aplica cuando VisualStylesMode es Net11 o más reciente.
Control.VisualStylesMode es una propiedad ambiente, similar a BackColor o Font. La resolución recorre la cadena de elementos principales y, cuando llega al nivel superior, se aplica por defecto el valor Application.DefaultVisualStylesMode. Llama a Control.GetVisualStylesModeChangeImpact para ver qué hay que actualizar cuando cambian los modos y utiliza la propiedad Control.EffectiveVisualStylesMode para obtener el valor resuelto tras la herencia.
using System.Windows.Forms;
Application.SetDefaultVisualStylesMode(VisualStylesMode.Net11);
Form form = new()
{
Text = "Modern visual styles",
VisualStylesMode = VisualStylesMode.Latest,
};
ComboBox combo = new() { Dock = DockStyle.Top };
combo.Items.AddRange(["One", "Two", "Three"]);
form.Controls.Add(combo);
Application.Run(form);
Adaptarse a la configuración visual del sistema
System.Windows.Forms.Application.SystemVisualSettings muestra el color de acento, el estado de alto contraste, la visibilidad de las indicaciones del teclado, la configuración de animación del área de cliente, las métricas del borde de enfoque y el factor de escala del texto en una única instantánea. El nuevo System.Windows.Forms.Application.SystemVisualSettingsChanged evento se desencadena cada vez que cambia una de esas categorías, por lo que solo puede actualizar la interfaz de usuario afectada en lugar de volver a generar recursos de tema en cada notificación.
System.Windows.Forms.SystemVisualSettingsChangedEventArgs.Changed es un SystemVisualSettingsCategories valor de marca que indica qué categorías cambiaron. Los controles pueden invalidar OnSystemVisualSettingsChanged para responder localmente.
using System.Drawing;
using System.Windows.Forms;
Application.SystemVisualSettingsChanged += (sender, e) =>
{
if ((e.Changed & SystemVisualSettingsCategories.AccentColor) != 0)
{
Color accent = e.NewSettings.AccentColor;
Console.WriteLine($"Accent color changed to {accent}.");
}
if ((e.Changed & SystemVisualSettingsCategories.TextScale) != 0)
{
Console.WriteLine($"Text scale is now {e.NewSettings.TextScaleFactor:P0}.");
}
};
Revelación diferida de formularios
System.Windows.Forms.FormRevealMode proporciona a las aplicaciones control sobre cuándo un formulario se vuelve visible durante el inicio.
FormRevealMode.Deferred mantiene un formulario oculto hasta que se estabilicen su diseño inicial y su tematización, evitando el breve destello de una ventana sin formato cuando el modo oscuro o los nuevos estilos visuales se aplican después de mostrarse el formulario por primera vez.
FormRevealMode.Classic mantiene el comportamiento existente de mostrar inmediatamente y FormRevealMode.Inherit sigue el valor establecido con Application.SetDefaultFormRevealMode. Llame Application.IsFormRevealDeferred a para obtener el estado resuelto y controle el Form.FormRevealModeChanged evento cuando cambie el valor.
using System.Windows.Forms;
Application.SetDefaultVisualStylesMode(VisualStylesMode.Net11);
Application.SetDefaultFormRevealMode(FormRevealMode.Deferred);
Form form = new() { Text = "No unstyled flash on startup" };
Application.Run(form);
Suspender el renderizado durante las modificaciones masivas
La nueva System.Windows.Forms.ISupportSuspendPainting interfaz y el método de ControlMutationExtensions.SuspendPainting extensión combinan BeginUpdate/EndUpdate ySuspendLayout/ResumeLayout en un único IDisposable ámbito.
LayoutSuspendTraversal controla si la suspensión se aplica solo al destino o al destino y a todos sus descendientes. Este enfoque resulta útil cuando se aplican cambios a contenedores anidados TableLayoutPanel con redimensionamiento automático, ya que la suspensión evita las tormentas de diseño y el parpadeo.
ComboBox, ListBox, ListView, RichTextBoxy TreeView ahora implementan ISupportSuspendPainting. Canalizan sus patrones de suspensión establecidos (BeginUpdate/EndUpdate) a través de la nueva interfaz, de modo que las ediciones masivas evitan el parpadeo sin necesidad de administrar múltiples llamadas emparejadas. Para todos los demás controles, el comportamiento de suspensión es nuevo.
using System.Windows.Forms;
ListBox list = new();
using (list.SuspendPainting(LayoutSuspendTraversal.Target))
{
for (int i = 0; i < 10_000; i++)
{
list.Items.Add($"Item {i}");
}
}
Aspecto de interruptor de palanca para CheckBox y RadioButton
System.Windows.Forms.Appearance.ToggleSwitch es un nuevo valor para CheckBox.Appearance que muestra el control como un interruptor en VisualStylesMode.Net11. El comportamiento actual de Checked, CheckedChanged y del enlace de datos no cambia, por lo que no necesitas actualizar el código al cambiar un CheckBox a la nueva apariencia. Puede modernizar los controles de casilla para alinearse con las convenciones de interfaz de usuario contemporáneas sin encontrar cambios importantes.
using System.Windows.Forms;
CheckBox toggle = new()
{
Text = "Enable notifications",
Appearance = Appearance.ToggleSwitch,
Checked = true,
};
Importante
El comportamiento de renderizado de los Estilos visuales y de las nuevas API asociadas todavía no está finalizado y seguirá cambiando hasta que .NET 11 alcance la disponibilidad general. En función de las pruebas exploratorias y los comentarios de los clientes, los controles que usan la configuración de estilo visual no clásico pueden ocupar más o menos espacio en las próximas versiones de .NET 11 (RC, GA) que en la versión preliminar 7. El comportamiento de las nuevas API también puede cambiar en detalle o en escenarios específicos.
Por este motivo, evite el diseño pixel-perfect cuando adopte estas características. Prefiere enfoques basados en diseño mediante TableLayoutPanel y FlowLayoutPanel, que se adaptan automáticamente a los cambios en las métricas de control.
Portapapeles
Clipboard.GetText con TextDataFormat.Rtf lee correctamente ahora los datos del portapapeles RTF que no incluyen un terminador nulo. Esta corrección resuelve un problema por el que el contenido RTF válido copiado de aplicaciones como PowerPoint devolvió una cadena vacía.
GetDataObject() devuelve un
IDataObjectque puede contener datos de mapa de bits colocados en el Portapapeles y GetImage() recupera la imagen de mapa de bits de ese objeto de datos. GetImage() también recupera la imagen directamente desde el Portapapeles. GetImage() recupera ahora imágenes a través de la canalización tipada del portapapeles llamando aTryGetData<Image>(DataFormats.Bitmap, autoConvert: true, ...)y devuelvenullcuando no puede recuperar una imagen.El siguiente código ahora realiza un intercambio de imágenes de mapa de bits cuando
bitmapes un Bitmap existente y se obtiene la imagen a través del objeto de datos devuelto:// Round-trips again on .NET 11 Clipboard.SetImage(bitmap); Image? image = Clipboard.GetDataObject()?.GetImage();
ToolStrip
ToolStripDropDown ahora conserva el seguimiento del menú modal durante los cambios de foco, por lo que SmartTag y la interfaz de usuario desplegable se cierran normalmente cuando los usuarios cambian las páginas de pestañas o mueven el foco a otros controles. Esto corrige una regresión que provocaba que los menús desplegables permanecieran abiertos indebidamente.
ToolStrip controles con
TabStop=trueya no activan incorrectamente la gestión del menú tras navegar con la tecla Tab. Anteriormente, este comportamiento impedía que los controles, como TreeView, recibieran la entrada de las teclas de dirección.El desplazamiento ToolStripDropDownMenu controla correctamente ahora los límites del menú sin provocar desplazamiento fuera de los límites ni cerrar involuntariamente el menú desplegable.
ToolStrip Los cambios de DPI ahora conservan los DPI anteriores del dispositivo durante el proceso de cambio de DPI, para que la lógica de escalado funcione correctamente al mover controles entre pantallas con distintas configuraciones de DPI.
Diseño
-
AnchorLayoutV2ahora inicializa correctamente los metadatos de anclaje que faltan cuando los controles anclados se reemplazan durante un paso de diseño suspendido, lo que impide incoherencias de diseño.
Diseñador
Los diseñadores de Windows Forms alojados ahora pueden volver a pegar controles mediante
CommandSet.OnMenuPaste, restableciendo la función de pegado, que antes no funcionaba.Los títulos del editor de colecciones para controles personalizados ahora muestran el tipo de control subyacente en lugar del nombre del contenedor
ControlProxy<T>generado, lo que facilita la identificación de los controles en el diseñador.
PropertyGrid
- PropertyGrid.SelectedTab ahora se actualiza correctamente cuando se asigna PropertyGrid.SelectedObject.
Modo oscuro
- ProgressBar ahora tiene colores de primer plano y de fondo predeterminados para la representación en modo oscuro, lo que mejora la coherencia visual en las aplicaciones con temas fluent.
Correcciones de errores
Control: Se ha corregido la regresión en el análisis del modificador inmediato secuencial SendKeys (como
^a^c,+a+c,%f%t). ElKeyboardToolTipStateMachineya no lanza una excepciónKeyNotFoundExceptioncuando cambia el foco durante un evento de aparición de información sobre herramientas.ListBox: Los valores de
IsSynchronizedahora son correctos en todas las coleccionesListBox.NumericUpDown: se ha corregido la regresión de representación del botón que se produjo cuando se deshabilitan los estilos visuales.
SplitContainer: El control ahora administra un
ExternalExceptionGDI+ transitorio durante la transición de sesión de visualización al llamar aRepaintSplitterRect.ToolStrip: El botón de desplazamiento hacia abajo ya no lanza una excepción al desplazarse. Los iconos indeterminados y comprobados
ToolStripMenuItemahora están visibles en modo oscuro.PropertyGrid: El icono del botón de la página de propiedades ya no cambia cuando se activa
LargeButtonsen resoluciones de alto DPI.ResetHelpForeColorahora restablece correctamente el color de primer plano en lugar del color de fondo.PrintPreviewControl:
ForeColorla representación ahora es correcta cuando se establece en Blanco.Modo oscuro:
LinkLabelel contraste en modo oscuro se mejora.TabControl, anidado enSplitContainer, ahora se adapta al modo oscuro.HelpProviderel texto ahora está visible en modo oscuro.ToolTipahora pasa a modo oscuro cuandoSystemColorMode.Darkestá establecido.
.NET Desktop feedback