Compartir a través de


Compatibilidad con DPI altos en Windows Forms

A partir de el .NET Framework 4.7, Windows Forms incluye mejoras para escenarios comunes de alta DPI y DPI dinámico. Estos incluyen:

  • Mejoras en el escalado y diseño de varios controles de Windows Forms, como el MonthCalendar control y el CheckedListBox control.

  • Escalado de un solo paso. En .NET Framework 4.6 y versiones anteriores, el escalado se realizó a través de varios pasos, lo que provocó que algunos controles se escalasen más de lo necesario.

  • Compatibilidad con escenarios de PPP dinámicos en los que el usuario cambia el PPP o el factor de escala después de iniciar una aplicación de Windows Forms.

En las versiones de .NET Framework a partir de .NET Framework 4.7, la compatibilidad mejorada con valores altos de PPP es una característica opcional. Debe configurar la aplicación para aprovecharla.

Configurar tu aplicación de Windows Forms para compatibilidad con alta resolución de PPP

Importante

Esta información solo se aplica a .NET Framework. Para habilitar la alta compatibilidad de PPP en .NET, consulte Configuraciones a nivel de proyecto de la aplicación.

Las nuevas características de Windows Forms que admiten un reconocimiento elevado de PPP solo están disponibles en las aplicaciones que tienen como destino .NET Framework 4.7 y se ejecutan en sistemas operativos Windows a partir de Windows 10 Creators Update.

Además, para configurar la compatibilidad con valores altos de PPP en la aplicación de Windows Forms, debe hacer lo siguiente:

  • Declare la compatibilidad con Windows 10.

    Para ello, agregue lo siguiente al archivo de manifiesto:

    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
      <application>
        <!-- Windows 10 compatibility -->
        <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
      </application>
    </compatibility>
    
  • Habilite el reconocimiento de PPP por monitor en el archivo app.config .

    Windows Forms presenta un nuevo <System.Windows.Forms.ApplicationConfigurationSection> elemento para admitir nuevas características y personalizaciones agregadas a partir de .NET Framework 4.7. Para aprovechar las nuevas características que admiten valores altos de DPI, agregue lo siguiente al archivo de configuración de la aplicación.

    <configuration>
      <!-- ... other xml settings ... -->
    
      <System.Windows.Forms.ApplicationConfigurationSection>
        <add key="DpiAwareness" value="PerMonitorV2" />
      </System.Windows.Forms.ApplicationConfigurationSection>
    
    </configuration>
    

    Importante

    En versiones anteriores de .NET Framework, usó el manifiesto para agregar compatibilidad con valores altos de PPP. Este enfoque ya no se recomienda, ya que invalida la configuración definida en el archivo app.config.

  • Llame al método estático EnableVisualStyles.

    Esta debe ser la primera llamada al método en el punto de entrada de la aplicación. Por ejemplo:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form2());
    }
    

Excluirse de funciones individuales de DPI alto

Importante

Esta información solo se aplica a .NET Framework. Para habilitar la alta compatibilidad de PPP en .NET, consulte Configuraciones a nivel de proyecto de la aplicación.

Al establecer el valor DpiAwareness en PerMonitorV2, se activan todas las características de alta conciencia de PPP compatibles con las versiones de .NET Framework desde la 4.7. Normalmente, esto es adecuado para la mayoría de las aplicaciones de Windows Forms. Sin embargo, puede optar por no participar en una o varias características individuales. La razón más importante para hacerlo es que el código de aplicación existente ya controla esa característica. Por ejemplo, si la aplicación controla el escalado automático, es posible que desee deshabilitar la característica de cambio de tamaño automático de la siguiente manera:

<configuration>
  <!-- ... other xml settings ... -->

  <System.Windows.Forms.ApplicationConfigurationSection>
    <add key="DpiAwareness" value="PerMonitorV2" />
    <add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
  </System.Windows.Forms.ApplicationConfigurationSection>

</configuration>

Para obtener una lista de claves individuales y sus valores, vea Windows Forms Agregar Elemento de Configuración.

Nuevos eventos de cambio de PPP

A partir de .NET Framework 4.7, tres nuevos eventos permiten controlar mediante programación los cambios dinámicos de PPP:

  • DpiChangedAfterParent, que se desencadena cuando la configuración de DPI de un control se cambia programáticamente después de que se haya producido un evento de cambio de DPI en su control primario o formulario.
  • DpiChangedBeforeParent, que se activa cuando se cambia la configuración de DPI de un control programáticamente antes de que ocurra un evento de cambio de DPI en su control o formulario principal.
  • DpiChanged, que se desencadena cuando cambia la configuración de DPI en el dispositivo de visualización donde el formulario se muestra actualmente.

Nuevos métodos y propiedades auxiliares

.NET Framework 4.7 también agrega varios nuevos métodos auxiliares y propiedades que proporcionan información sobre el escalado de PPP y le permiten realizar el escalado de PPP. Estos incluyen:

Consideraciones de control de versiones

Además de ejecutarse en .NET Framework 4.7 y Windows 10 Creators Update, la aplicación también se puede ejecutar en un entorno en el que no es compatible con mejoras de alta DPI. En este caso, deberá desarrollar un plan de respaldo para su aplicación. Puede hacerlo para realizar un dibujo personalizado para gestionar el escalado.

Para ello, también debes determinar el sistema operativo en el que se ejecuta la aplicación. Puede hacerlo con código similar al siguiente:

// Create a reference to the OS version of Windows 10 Creators Update.
Version OsMinVersion = new Version(10, 0, 15063, 0);

// Access the platform/version of the current OS.
Console.WriteLine(Environment.OSVersion.Platform.ToString());
Console.WriteLine(Environment.OSVersion.VersionString);

// Compare the current version to the minimum required version.
Console.WriteLine(Environment.OSVersion.Version.CompareTo(OsMinVersion));

Tenga en cuenta que la aplicación no detectará correctamente Windows 10 si no aparece como un sistema operativo compatible en el manifiesto de aplicación.

También puede comprobar la versión de .NET Framework en la que se compiló la aplicación:

Console.WriteLine(AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName);

Consulte también