Obsługa wysokiej rozdzielczości DPI w formularzach systemu Windows

Począwszy od programu .NET Framework 4.7, formularze systemu Windows zawierają ulepszenia typowych scenariuszy o wysokiej rozdzielczości DPI i dynamicznej rozdzielczości DPI. Są to:

  • Ulepszenia skalowania i układu wielu kontrolek Windows Forms, takich jak kontrolka MonthCalendar i kontrolka CheckedListBox .

  • Skalowanie jednoprzepustowe. W programie .NET Framework 4.6 i starszych wersjach skalowanie zostało przeprowadzone przez wiele przebiegów, co spowodowało, że niektóre kontrolki były skalowane bardziej niż było to konieczne.

  • Obsługa dynamicznych scenariuszy DPI, w których użytkownik zmienia współczynnik DPI lub współczynnik skalowania po uruchomieniu aplikacji Windows Forms.

W wersjach programu .NET Framework, począwszy od programu .NET Framework 4.7, rozszerzona obsługa wysokiej rozdzielczości DPI jest funkcją zgody. Aby móc z niej korzystać, należy skonfigurować aplikację.

Konfigurowanie aplikacji Windows Forms pod kątem obsługi wysokiej rozdzielczości DPI

Nowe funkcje formularzy systemu Windows, które obsługują rozpoznawanie dpi, są dostępne tylko w aplikacjach przeznaczonych dla programu .NET Framework 4.7 i są uruchomione w systemach operacyjnych Windows, począwszy od Aktualizacja systemu Windows 10 dla twórców.

Ponadto aby skonfigurować obsługę wysokiej rozdzielczości DPI w aplikacji Windows Forms, należy wykonać następujące czynności:

  • Zadeklaruj zgodność z systemem Windows 10.

    W tym celu dodaj następujący kod do pliku manifestu:

    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
      <application>
        <!-- Windows 10 compatibility -->
        <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
      </application>
    </compatibility>
    
  • Włącz rozpoznawanie dpi na monitorze w pliku app.config .

    Windows Forms wprowadza nowy <System.Windows.Forms.ApplicationConfigurationSection> element do obsługi nowych funkcji i dostosowań dodanych począwszy od programu .NET Framework 4.7. Aby skorzystać z nowych funkcji obsługujących wysoką dpi, dodaj następujący kod do pliku konfiguracji aplikacji.

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

    Ważne

    W poprzednich wersjach programu .NET Framework użyto manifestu w celu dodania obsługi wysokiej rozdzielczości DPI. Takie podejście nie jest już zalecane, ponieważ zastępuje ustawienia zdefiniowane w pliku app.config.

  • Wywołaj metodę statyczną EnableVisualStyles .

    Powinno to być pierwsze wywołanie metody w punkcie wejścia aplikacji. Przykład:

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

Rezygnacja z poszczególnych funkcji wysokiej rozdzielczości DPI

Ustawienie wartości w celu PerMonitorV2 włączenia DpiAwareness wszystkich funkcji rozpoznawania dpi obsługiwanych przez wersje programu .NET Framework, począwszy od programu .NET Framework 4.7. Zazwyczaj jest to odpowiednie dla większości aplikacji Windows Forms. Możesz jednak zrezygnować z jednej lub większej liczby poszczególnych funkcji. Najważniejszą przyczyną jest to, że istniejący kod aplikacji już obsługuje tę funkcję. Jeśli na przykład aplikacja obsługuje skalowanie automatyczne, możesz wyłączyć funkcję automatycznego zmieniania rozmiaru w następujący sposób:

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

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

</configuration>

Aby uzyskać listę poszczególnych kluczy i ich wartości, zobacz Windows Forms Add Configuration Element (Dodawanie elementu konfiguracji formularzy systemu Windows).

Nowe zdarzenia zmiany DPI

Począwszy od programu .NET Framework 4.7, trzy nowe zdarzenia umożliwiają programowe obsługę dynamicznych zmian DPI:

  • DpiChangedAfterParent, który jest uruchamiany, gdy ustawienie DPI dla kontrolki jest zmieniane programowo po wystąpieniu zdarzenia zmiany DPI dla kontrolki nadrzędnej lub formularza.
  • DpiChangedBeforeParent, który jest wyzwalany, gdy ustawienie DPI dla kontrolki jest zmieniane programowo przed wystąpieniem zdarzenia zmiany DPI dla nadrzędnej kontrolki lub formularza.
  • DpiChanged, który jest uruchamiany, gdy ustawienie DPI zmienia się na urządzeniu wyświetlania, na którym jest obecnie wyświetlany formularz.

Nowe metody i właściwości pomocnika

Program .NET Framework 4.7 dodaje również szereg nowych metod i właściwości pomocnika, które zapewniają informacje o skalowaniu DPI i umożliwiają przeprowadzanie skalowania DPI. Są to:

Zagadnienia dotyczące przechowywania wersji

Oprócz uruchamiania w programie .NET Framework 4.7 i Aktualizacja systemu Windows 10 dla twórców aplikacja może być również uruchamiana w środowisku, w którym nie jest zgodna z ulepszeniami wysokiej rozdzielczości DPI. W takim przypadku należy opracować rezerwę dla aplikacji. Można to zrobić, aby wykonać niestandardowy rysunek w celu obsługi skalowania.

W tym celu należy również określić system operacyjny, na którym działa aplikacja. Możesz to zrobić za pomocą kodu w następujący sposób:

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

Pamiętaj, że aplikacja nie wykryje pomyślnie systemu Windows 10, jeśli nie została wyświetlona jako obsługiwany system operacyjny w manifeście aplikacji.

Możesz również sprawdzić wersję programu .NET Framework, dla której utworzono aplikację:

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

Zobacz też