Compatibilidad con valores altos de PPP en Windows Forms

A partir de .NET Framework 4.7, Windows Forms incluye mejoras para escenarios comunes de valores altos de PPP y PPP dinámicos. Entre ellas se incluyen las siguientes:

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

  • Escalado de paso único. En .NET Framework 4.6 y versiones anteriores, el escalado se realizaba a través de varios pasos, lo que hacía que algunos controles escalasen más de lo necesario.

  • Compatibilidad con escenarios de PPP dinámicos, en los que el usuario cambia el valor de 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 que puede optar por usar. Para ello, debe configurar la aplicación como corresponda.

Configuración de la aplicación de Windows Forms para admitir valores altos de PPP

Las nuevas características de Windows Forms que admiten el reconocimiento de valores altos de PPP solamente están disponibles en las aplicaciones pensadas para .NET Framework 4.7 y que 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:

  • Declarar 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>
    
  • Habilitar el reconocimiento de PPP por monitor en el archivo app.config.

    Windows Forms incluye un nuevo elemento <System.Windows.Forms.ApplicationConfigurationSection> para admitir las nuevas características y personalizaciones incorporadas a partir de .NET Framework 4.7. Para usar las nuevas características que admiten valores altos de PPP, 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, se usaba 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.

  • Llamar al método EnableVisualStyles estático.

    Esta debe ser la primera llamada a 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());
    }
    

Decisión de no usar características individuales de valores altos de PPP

Establecer el valor de DpiAwareness en PerMonitorV2 habilita todas las características de reconocimiento de valores altos de PPP admitidas por las versiones de .NET Framework a partir de .NET Framework 4.7. Esto suele ser lo adecuado para la mayoría de las aplicaciones de Windows Forms, pero puede optar por no usar 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, puede 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 Elemento de configuración Add de Windows Forms.

Nuevos eventos de cambio de PPP

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

  • DpiChangedAfterParent, que se desencadena al cambiar la configuración de PPP de un control mediante programación antes de que tenga lugar un evento de cambio de PPP de su control o formulario principal.
  • DpiChangedBeforeParent, que se desencadena al cambiar mediante programación la configuración de PPP de un control antes de que tenga lugar un evento de cambio de PPP de su control o formulario principal.
  • DpiChanged, que se desencadena al cambiar la configuración de PPP de la pantalla donde se muestra actualmente el formulario.

Nuevas propiedades y métodos auxiliares

.NET Framework 4.7 también incorpora una serie de propiedades y métodos auxiliares nuevos que proporcionan información sobre el escalado de PPP y le permiten realizar el escalado de PPP. Entre ellas se incluyen las siguientes:

Consideraciones de control de versiones

Además de en .NET Framework 4.7 y Windows 10 Creators Update, la aplicación también se puede ejecutar en un entorno que no sea compatible con las mejoras de valores altos de PPP. En este caso, deberá desarrollar una reserva para la aplicación. Puede hacerlo para realizar un dibujo personalizado para controlar el escalado.

Para ello, también es necesario determinar el sistema operativo en el que la aplicación se ejecuta. Esto se puede hacer 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