Supporto dpi elevato in Windows Form

A partire da .NET Framework 4.7, Windows Form include miglioramenti per scenari DPI elevati e DPI dinamici comuni. tra cui:

  • Miglioramenti del ridimensionamento e del layout di un certo numero di controlli Windows Form, ad esempio il MonthCalendar controllo e il CheckedListBox controllo.

  • Scalabilità a passaggio singolo. In .NET Framework 4.6 e versioni precedenti, il ridimensionamento è stato eseguito tramite più passaggi, il che ha causato la scalabilità di alcuni controlli più del necessario.

  • Supporto per scenari DPI dinamici in cui l'utente modifica il fattore di scala o DPI dopo l'avvio di un'applicazione Windows Form.

Nelle versioni di .NET Framework a partire da .NET Framework 4.7, il supporto avanzato per valori DPI elevati è una funzionalità di consenso esplicito. È necessario configurare l'applicazione per sfruttarla.

Configurazione dell'app Windows Form per il supporto dpi elevato

Le nuove funzionalità di Windows Form che supportano la consapevolezza dpi elevata sono disponibili solo nelle applicazioni destinate a .NET Framework 4.7 e in esecuzione nei sistemi operativi Windows a partire da Windows 10 Creators Update.

Inoltre, per configurare il supporto dpi elevato nell'applicazione Windows Form, è necessario eseguire le operazioni seguenti:

  • Dichiarare la compatibilità con Windows 10.

    A tale scopo, aggiungere quanto segue al file manifesto:

    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
      <application>
        <!-- Windows 10 compatibility -->
        <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
      </application>
    </compatibility>
    
  • Abilitare la consapevolezza DPI per monitor nel file app.config .

    Windows Form introduce un nuovo <System.Windows.Forms.ApplicationConfigurationSection> elemento per supportare nuove funzionalità e personalizzazioni aggiunte a partire da .NET Framework 4.7. Per sfruttare le nuove funzionalità che supportano valori DPI elevati, aggiungere quanto segue al file di configurazione dell'applicazione.

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

    Importante

    Nelle versioni precedenti di .NET Framework è stato usato il manifesto per aggiungere il supporto dpi elevato. Questo approccio non è più consigliato, poiché esegue l'override delle impostazioni definite nel file app.config.

  • Chiamare il metodo statico EnableVisualStyles .

    Deve trattarsi della prima chiamata al metodo nel punto di ingresso dell'applicazione. Ad esempio:

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

Rifiuto esplicito delle singole funzionalità dpi elevate

L'impostazione del DpiAwareness valore su PerMonitorV2 abilita tutte le funzionalità di riconoscimento DPI elevate supportate dalle versioni di .NET Framework a partire da .NET Framework 4.7. In genere, questo è adeguato per la maggior parte delle applicazioni Windows Form. Tuttavia, è possibile rifiutare esplicitamente una o più funzionalità singole. Il motivo più importante per eseguire questa operazione è che il codice dell'applicazione esistente gestisce già tale funzionalità. Ad esempio, se l'applicazione gestisce il ridimensionamento automatico, è possibile disabilitare la funzionalità di ridimensionamento automatico come indicato di seguito:

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

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

</configuration>

Per un elenco delle singole chiavi e dei relativi valori, vedere Windows Form Aggiungi elemento di configurazione.

Nuovi eventi di modifica DPI

A partire da .NET Framework 4.7, tre nuovi eventi consentono di gestire le modifiche dpi dinamiche a livello di codice:

  • DpiChangedAfterParent, generato quando l'impostazione DPI per un controllo viene modificata a livello di codice dopo che si è verificato un evento di modifica DPI per il controllo padre o la maschera.
  • DpiChangedBeforeParent, generato quando l'impostazione DPI per un controllo viene modificata a livello di codice prima che si sia verificato un evento di modifica DPI per il controllo padre o la maschera.
  • DpiChanged, generato quando l'impostazione DPI cambia nel dispositivo di visualizzazione in cui è attualmente visualizzato il modulo.

Nuovi metodi e proprietà helper

.NET Framework 4.7 aggiunge anche una serie di nuovi metodi helper e proprietà che forniscono informazioni sul ridimensionamento DPI e consentono di eseguire il ridimensionamento DPI. tra cui:

Considerazioni sul controllo delle versioni

Oltre a essere in esecuzione in .NET Framework 4.7 e Windows 10 Creators Update, l'applicazione può essere eseguita anche in un ambiente in cui non è compatibile con miglioramenti dpi elevati. In questo caso, è necessario sviluppare un fallback per l'applicazione. È possibile eseguire questa operazione per eseguire un disegno personalizzato per gestire il ridimensionamento.

A tale scopo, devi anche determinare il sistema operativo in cui è in esecuzione l'app. A tale scopo, è possibile usare codice simile al seguente:

// 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));

Si noti che l'applicazione non rileverà correttamente Windows 10 se non è elencato come sistema operativo supportato nel manifesto dell'applicazione.

È anche possibile controllare la versione di .NET Framework in base alla quale è stata compilata l'applicazione:

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

Vedi anche