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.
El escalado automático permite que un formulario y sus controles, diseñados en una máquina con una determinada resolución de pantalla o fuente, se muestren adecuadamente en otra máquina con una resolución de pantalla o fuente diferente. Los formularios y los controles cambian de tamaño inteligentemente para mantener la coherencia con las ventanas nativas y otras aplicaciones en las máquinas de los usuarios y otros desarrolladores. El escalado automático y los estilos visuales ayudan a las aplicaciones de Windows Forms a mantener un aspecto coherente en comparación con las aplicaciones nativas de Windows en el equipo de cada usuario.
En su mayor parte, el escalado automático funciona según lo previsto en Windows Forms. Sin embargo, los cambios en la combinación de fuentes pueden ser problemáticos. Para ver un ejemplo de cómo resolver este problema, consulte Cómo: Responder a los cambios del esquema de fuentes en una aplicación de Windows Forms.
Reconocimiento de PPP en .NET
El reconocimiento de PPP se configura a través del archivo de proyecto mediante la ApplicationHighDpiMode propiedad , que se establece SystemAware en de forma predeterminada. Esta configuración trabaja junto con el sistema de inicio de la aplicación para configurar automáticamente la gestión de DPI al iniciarse la aplicación.
El modo de DPI predeterminado y recomendado en las aplicaciones de Windows Forms es SystemAware. Este modo consulta la configuración de PPP una vez al inicio de la aplicación y usa ese valor durante toda la duración de la aplicación, lo que proporciona un comportamiento de escalado coherente.
Configure el modo DPI en su archivo de proyecto:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
</PropertyGroup>
</Project>
Note
Aunque el enfoque recomendado es configurar los PPP a través del archivo del proyecto, aún es posible usar un archivo de manifiesto de la aplicación (app.manifest) para anular estos ajustes. Sin embargo, no se recomienda usar el manifiesto porque puede provocar conflictos con la configuración de la aplicación. Para obtener más información, vea WFO0003 advertencia del compilador.
consideraciones del diseñador de Visual Studio
Al diseñar formularios en Visual Studio, es posible que tenga que configurar el reconocimiento de PPP del diseñador por separado de la aplicación. A partir de la versión 17.8 de Visual Studio 2022, puede establecer la propiedad ForceDesignerDPIUnaware en el archivo del proyecto para que el diseñador de Windows Forms se ejecute en modo sin reconocimiento de PPP. Esta configuración ayuda a evitar problemas de visualización al diseñar formularios en monitores de alta densidad de píxeles (PPP):
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
</PropertyGroup>
</Project>
Esta propiedad solo afecta al diseñador de Visual Studio y no cambia cómo se ejecuta la aplicación. Para obtener más información, consulte Deshabilitar la compatibilidad con PPP para corregir problemas de escalado.
Los modos de DPI disponibles incluyen:
-
SystemAware—La aplicación consulta el valor de DPI una sola vez al iniciarse y utiliza este valor durante toda la ejecución de la aplicación. -
PerMonitor—La aplicación comprueba los cambios de DPI en cada monitor y reajusta la escala cuando el DPI cambia. -
PerMonitorV2: similar aPerMonitor, pero habilita las notificaciones de cambio de PPP de ventana secundaria y mejora el comportamiento de escalado. -
DpiUnaware—La aplicación no se adapta a los cambios de DPI, y Windows se encarga del escalado. -
DpiUnawareGdiScaled: similar aDpiUnawarepero proporciona una mejor calidad para el contenido basado en GDI.
Para obtener más información sobre cómo configurar los valores de PPP, vea Novedades de Windows Forms para .NET 6.
Necesidad de escalado automático
Sin escalado automático, una aplicación diseñada para una resolución de pantalla o fuente parece demasiado pequeña o demasiado grande cuando esa resolución o fuente cambia. Por ejemplo, si diseña una aplicación con Tahoma 9 punto como línea base, sin ajustarlo parece demasiado pequeño cuando se ejecuta en una máquina donde la fuente del sistema es Tahoma 12 punto. Los elementos de texto, como los títulos, los menús y el contenido de los cuadros de texto, se muestran más pequeños que en otras aplicaciones. Además, el tamaño de los elementos de la interfaz de usuario (UI) que contienen texto, como la barra de título, los menús y muchos controles, dependen de la fuente usada. En este ejemplo, estos elementos también aparecen relativamente más pequeños.
Una situación análoga se produce cuando se diseña una aplicación para una determinada resolución de pantalla. La resolución de pantalla más común es de 96 puntos por pulgada (PPP), lo que equivale a una escala de pantalla del 100 %, pero las pantallas de mayor resolución, que admiten un 125 %, 150 %, 200 % (que equivalen, respectivamente, a 120, 144 y 192 PPP) o más, son cada vez más comunes. Sin ajuste, una aplicación, especialmente una basada en gráficos, diseñada para una resolución aparece demasiado grande o demasiado pequeña cuando se ejecuta en otra resolución.
El escalado automático soluciona estos problemas al cambiar automáticamente el tamaño del formulario y sus controles secundarios según el tamaño de fuente relativo o la resolución de pantalla. El sistema operativo Windows admite el escalado automático de cuadros de diálogo mediante una unidad de medida relativa denominada unidades de diálogo. Una unidad de diálogo se basa en la fuente del sistema y su relación con píxeles se puede determinar a través de la función GetDialogBaseUnitsdel SDK de Win32 . Cuando un usuario cambia el tema usado por Windows, todos los cuadros de diálogo se ajustan automáticamente en consecuencia. Windows Forms admite el escalado automático según la fuente predeterminada del sistema o la resolución de pantalla. Opcionalmente, puede deshabilitar el escalado automático en una aplicación.
Precaución
No se admiten combinaciones arbitrarias de PPP y modos de escalado de la fuente. Aunque puede escalar un control de usuario con un modo (por ejemplo, DPI) y colocarlo en un formulario con otro modo (Fuente) sin problemas, mezclar un formulario base en un modo y un formulario derivado en otro puede provocar resultados inesperados.
Escalado automático en acción
Windows Forms usa la siguiente lógica para escalar automáticamente formularios y su contenido:
En tiempo de diseño, cada ContainerControl almacena el modo de escalado y su resolución actual en las propiedades AutoScaleMode y AutoScaleDimensions, respectivamente.
En tiempo de ejecución, la resolución real se almacena en la CurrentAutoScaleDimensions propiedad . La AutoScaleFactor propiedad calcula dinámicamente la relación entre la resolución de escalado en tiempo de ejecución y tiempo de diseño.
Cuando se carga el formulario, si los valores de CurrentAutoScaleDimensions y AutoScaleDimensions difieren, se llama al método PerformAutoScale para escalar el control y sus elementos secundarios. Este método suspende el diseño y llama al Scale método para realizar el escalado real. Después, el valor de AutoScaleDimensions se actualiza para evitar el escalado progresivo.
PerformAutoScale también se invoca automáticamente en las situaciones siguientes:
En respuesta al evento OnFontChanged si el modo de escalado es Font.
Cuando se reanuda el diseño del control de contenedor y se detecta un cambio en las propiedades AutoScaleDimensions o AutoScaleMode.
Cuando se escala un elemento primario ContainerControl . Cada control de contenedor es responsable de escalar sus elementos secundarios mediante sus propios factores de escalado y no el de su contenedor padre.
Los controles secundarios pueden modificar su comportamiento de escalado a través de varios medios:
Invalide la ScaleChildren propiedad para determinar si se deben escalar sus controles secundarios.
Invalide el GetScaledBounds método para ajustar los límites a los que se escala el control, pero no la lógica de escalado.
Invalide el ScaleControl método para cambiar la lógica de escalado del control actual.
Mejoras de PPP elevadas
.NET incluye mejoras significativas en la representación de PPP altos, especialmente con el modo PerMonitorV2:
- Compatibilidad de DPI por monitor—Las aplicaciones se ajustan dinámicamente al moverse entre monitores con diferentes valores de DPI.
- Comportamiento de escalado mejorado—Los controles se escalan correctamente cuando cambia el DPI, incluidos los controles anidados y los contenedores (.NET 6+).
- Escalado del tamaño del formulario—las propiedades MaximumSize y MinimumSize se escalan en función de la configuración de DPI del monitor (.NET 7+, habilitada de forma predeterminada en .NET 8+).
-
Eventos de cambio de DPI—Los nuevos eventos permiten gestionar mediante programación los cambios dinámicos de DPI:
- DpiChanged—Se produce cuando cambia la configuración de DPI en el dispositivo de pantalla en el que se muestra actualmente el formulario.
- DpiChangedBeforeParent—Se desencadena cuando la configuración de PPP de un control se cambia mediante programación antes de que se produzca un evento de cambio de PPP para su control primario o formulario.
- DpiChangedAfterParent—Se produce cuando la configuración de DPI de un control cambia mediante programación después de que se produzca un evento de cambio de DPI en su control o formulario padre.
Para obtener más información sobre las mejoras de DPI altos, consulte Novedades de Windows Forms para .NET 6, Novedades de Windows Forms para .NET 7 y Novedades de Windows Forms para .NET 8.
Diferencias del .NET Framework
.NET Framework y .NET controlan el reconocimiento de PPP de forma diferente:
- En .NET Framework, configure la compatibilidad con PPP mediante un archivo app.config con el elemento
<System.Windows.Forms.ApplicationConfigurationSection>. - En .NET, configure la compatibilidad con PPP a través del archivo de proyecto con la propiedad
ApplicationHighDpiMode. - .NET Framework usa archivos de manifiesto para la configuración de DPI, algo que ya no se recomienda.
- .NET proporciona un mejor comportamiento de escalado y un control de cambios de PPP más confiable.
Para obtener información sobre la configuración de DPI de .NET Framework, consulte Compatibilidad con DPI altos en Windows Forms.
Consulte también
.NET Desktop feedback