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 el diseño de una serie de Windows Forms, como el MonthCalendar control y el control CheckedListBox .

  • Escalado de un solo paso. En la .NET Framework 4.6 y versiones anteriores, el escalado se realizó a través de varios pasos, lo que hizo que algunos controles se escalase 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 que se haya iniciado una Windows Forms.

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

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

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

Además, para configurar la compatibilidad con valores altos de PPP en la 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 archivoapp.config monitor.

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

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

    Importante

    En versiones anteriores de la .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 app.config archivo.

  • Llame al método EnableVisualStyles estático.

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

No participar en características individuales de valores altos de PPP

Al establecer el valor en , se habilitan todas las características de reconocimiento de valores altos de PPP que .NET Framework versiones anteriores a .NET Framework DpiAwareness PerMonitorV2 4.7. Normalmente, esto es adecuado para la mayoría 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 ajuste de tamaño automático de la siguiente manera:

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

Para obtener una lista de claves individuales y sus valores, vea Windows Forms Add Configuration Element.

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 PPP de un control se cambia mediante programación después de que se haya producido un evento de cambio de PPP para su control primario o formulario.
  • DpiChangedBeforeParent, que se desencadena cuando la configuración de PPP de un control se cambia mediante programación antes de que se haya producido un evento de cambio de PPP para su control o formulario primario.
  • DpiChanged, que se desencadena cuando cambia la configuración de PPP en el dispositivo de visualización donde se muestra actualmente el formulario.

Nuevos métodos y propiedades del asistente

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

Consideraciones de control de versiones

Además de ejecutarse en .NET Framework 4.7 y Windows 10 Creators Update, la aplicación también puede ejecutarse en un entorno en el que no sea compatible con mejoras de ppp altos. 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 debe determinar el sistema operativo en el que se ejecuta la aplicación. Puede hacerlo con código como el 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 la .NET Framework con la que se creó la aplicación:

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

Vea también