Compatibilidad con PPP alta en Windows FormsHigh DPI support in Windows Forms

A partir de la .NET Framework 4,7, Windows Forms incluye mejoras en los escenarios comunes de PPP alto y dinámicos.Starting with the .NET Framework 4.7, Windows Forms includes enhancements for common high DPI and dynamic DPI scenarios. Se incluyen los siguientes:These include:

  • Mejoras en el ajuste de escala y diseño de varios controles Windows Forms, como el control MonthCalendar y el control CheckedListBox.Improvements in the scaling and layout of a number of Windows Forms controls, such as the MonthCalendar control and the CheckedListBox control.

  • Ajuste de escala de un solo paso.Single-pass scaling. En el .NET Framework 4,6 y versiones anteriores, el escalado se realizaba a través de varias fases, lo que hacía que algunos controles se escalaran más de lo necesario.In the .NET Framework 4.6 and earlier versions, scaling was performed through multiple passes, which caused some controls to be scaled more than was necessary.

  • Compatibilidad con escenarios de PPP dinámicos en los que el usuario cambia los PPP o el factor de escala una vez que se ha iniciado una aplicación Windows Forms.Support for dynamic DPI scenarios in which the user changes the DPI or scale factor after a Windows Forms application has been launched.

En las versiones de la .NET Framework a partir del .NET Framework 4,7, la compatibilidad mejorada con PPP alta es una característica opcional.In versions of the .NET Framework starting with the .NET Framework 4.7, enhanced high DPI support is an opt-in feature. Debe configurar la aplicación para aprovecharla.You must configure your application to take advantage of it.

Configuración de la aplicación de Windows Forms para la compatibilidad con alta resolución de PPPConfiguring your Windows Forms app for high DPI support

Las nuevas características Windows Forms que admiten el reconocimiento de PPP alto solo están disponibles en las aplicaciones que tienen como destino el .NET Framework 4,7 y que se ejecutan en sistemas operativos Windows a partir de Windows 10 Creators Update.The new Windows Forms features that support high DPI awareness are available only in applications that target the .NET Framework 4.7 and are running on Windows operating systems starting with the Windows 10 Creators Update.

Además, para configurar la compatibilidad con alta PPP en la aplicación Windows Forms, debe hacer lo siguiente:In addition, to configure high DPI support in your Windows Forms application, you must do the following:

  • Declare la compatibilidad con Windows 10.Declare compatibility with Windows 10.

    Para ello, agregue lo siguiente al archivo de manifiesto:To do this, add the following to your manifest file:

    <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 .Enable per-monitor DPI awareness in the app.config file.

    Windows Forms introduce un nuevo elemento <System.Windows.Forms.ApplicationConfigurationSection> para admitir nuevas características y personalizaciones agregadas a partir de la .NET Framework 4,7.Windows Forms introduces a new <System.Windows.Forms.ApplicationConfigurationSection> element to support new features and customizations added starting with the .NET Framework 4.7. Agregue lo siguiente al archivo de configuración de la aplicación para aprovechar las nuevas características que admiten un máximo de PPP.To take advantage of the new features that support high DPI, add the following to your application configuration file.

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

    Importante

    En las versiones anteriores de la .NET Framework, se usaba el manifiesto para agregar compatibilidad con PPP alta.In previous versions of the .NET Framework, you used the manifest to add high DPI support. Ya no se recomienda este enfoque, ya que reemplaza los valores definidos en el archivo app. config.This approach is no longer recommended, since it overrides settings defined on the app.config file.

  • Llame al método estático EnableVisualStyles.Call the static EnableVisualStyles method.

    Debe ser la primera llamada al método en el punto de entrada de la aplicación.This should be the first method call in your application entry point. Por ejemplo:For example:

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

No participar en las características de PPP altas individualesOpting out of individual high DPI features

Al establecer el valor de DpiAwareness en PerMonitorV2, se habilitan todas las características de reconocimiento de PPP altas compatibles con las versiones de .NET Framework a partir del .NET Framework 4,7.Setting the DpiAwareness value to PerMonitorV2 enables all high DPI awareness features supported by .NET Framework versions starting with the .NET Framework 4.7. Normalmente, esto es adecuado para la mayoría de las aplicaciones Windows Forms.Typically, this is adequate for most Windows Forms applications. Sin embargo, es posible que desee no participar en una o varias características individuales.However, you may want to opt out of one or more individual features. La razón más importante para hacerlo es que el código de aplicación existente ya controla esa característica.The most important reason for doing this is that your existing application code already handles that feature. Por ejemplo, si la aplicación controla el escalado automático, puede que desee deshabilitar la característica de cambio de tamaño automático de la manera siguiente:For example, if your application handles auto scaling, you might want to disable the auto-resizing feature as follows:

<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 Agregar elemento de configuración.For a list of individual keys and their values, see Windows Forms Add Configuration Element.

Nuevos eventos de cambio de PPPNew DPI change events

A partir de la .NET Framework 4,7, tres nuevos eventos le permiten controlar mediante programación los cambios de PPP dinámicos:Starting with the .NET Framework 4.7, three new events allow you to programmatically handle dynamic DPI changes:

  • DpiChangedAfterParent, que se desencadena cuando se cambia mediante programación el valor de PPP para un control después de que se haya producido un evento de cambio de PPP para su control o formulario primario.DpiChangedAfterParent, which is fired when the DPI setting for a control is changed programmatically after a DPI change event for it's parent control or form has occurred.
  • DpiChangedBeforeParent, que se desencadena cuando se cambia la configuración de PPP para un control mediante programación antes de que se produzca un evento de cambio de PPP para su control o formulario primario.DpiChangedBeforeParent, which is fired when the DPI setting for a control is changed programmatically before a DPI change event for its parent control or form has occurred.
  • DpiChanged, que se desencadena cuando cambia el valor de PPP en el dispositivo de pantalla donde se muestra actualmente el formulario.DpiChanged, which is fired when the DPI setting changes on the display device where the form is currently displayed.

Nuevas propiedades y métodos auxiliaresNew helper methods and properties

El .NET Framework 4,7 también agrega una serie de nuevas propiedades y métodos auxiliares que proporcionan información sobre el ajuste de escala de PPP y permiten realizar el ajuste de escala de PPP.The .NET Framework 4.7 also adds a number of new helper methods and properties that provide information about DPI scaling and allow you to perform DPI scaling. Se incluyen los siguientes:These include:

Consideraciones sobre el control de versionesVersioning considerations

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 las mejoras de PPP altas.In addition to running on .NET Framework 4.7 and Windows 10 Creators Update, your application may also run in an environment in which it isn't compatible with high DPI improvements. En este caso, deberá desarrollar una reserva para la aplicación.In this case, you'll need to develop a fallback for your application. Puede hacer esto para realizar un dibujo personalizado con el fin de controlar el escalado.You can do this to perform custom drawing to handle scaling.

Para ello, también debe determinar el sistema operativo en el que se ejecuta la aplicación.To do this, you also need to determine the operating system on which your app is running. Puede hacerlo con código como el siguiente:You can do that with code like the following:

// 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.Note that your application won't successfully detect Windows 10 if it wasn't listed as a supported operating system in the application manifest.

También puede comprobar la versión de la .NET Framework en la que se compiló la aplicación:You can also check the version of the .NET Framework that the application was built against:

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

Vea tambiénSee also