Поддержка высокого уровня DPI в Windows Forms
Начиная с .NET Framework 4.7, Windows Forms включает улучшения для распространенных сценариев с высоким уровнем DPI и динамических DPI. К ним относятся:
Улучшения масштабирования и макета ряда элементов управления Windows Forms, таких как элемент управления MonthCalendar и элемент управления CheckedListBox.
Масштабирование с одним проходом. В .NET Framework 4.6 и более ранних версиях масштабирование выполнялось с помощью нескольких проходов, что привело к увеличению масштаба некоторых элементов управления, чем было необходимо.
Поддержка сценариев динамического DPI, в которых пользователь изменяет DPI или коэффициент масштабирования после запуска приложения Windows Forms.
В версиях .NET Framework, начиная с .NET Framework 4.7, расширенная поддержка высокого уровня DPI является функцией согласия. Необходимо настроить приложение, чтобы воспользоваться его преимуществами.
Настройка приложения Windows Forms для поддержки высокого уровня DPI
Новые функции Windows Forms, поддерживающие высокую осведомленность о DPI, доступны только в приложениях, предназначенных для .NET Framework 4.7 и работающих в операционных системах Windows, начиная с Обновления Windows 10 Creators Update.
Кроме того, чтобы настроить поддержку высокого уровня DPI в приложении Windows Forms, необходимо выполнить следующие действия:
Объявите совместимость с Windows 10.
Для этого добавьте следующий код в файл манифеста:
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows 10 compatibility --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" /> </application> </compatibility>
Включите поддержку DPI на уровне каждого монитора в файле app.config.
В Windows Forms представлен новый элемент
<System.Windows.Forms.ApplicationConfigurationSection>
для поддержки новых функций и настроек, добавленных начиная с .NET Framework 4.7. Чтобы воспользоваться новыми функциями, поддерживающими высокий уровень DPI, добавьте в файл конфигурации приложения следующее.<configuration> <!-- ... other xml settings ... --> <System.Windows.Forms.ApplicationConfigurationSection> <add key="DpiAwareness" value="PerMonitorV2" /> </System.Windows.Forms.ApplicationConfigurationSection> </configuration>
Важный
В предыдущих версиях .NET Framework манифест использовался для добавления поддержки высокого уровня DPI. Этот подход больше не рекомендуется, так как он переопределяет параметры, определенные в файле app.config.
Вызовите статический метод EnableVisualStyles.
Это должен быть первый вызов метода в точке входа приложения. Например:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form2()); }
Отказ от отдельных функций с высоким разрешением DPI
Установка значения DpiAwareness
для PerMonitorV2
включает все функции с высокой степенью осведомленности о DPI, поддерживаемые версиями .NET Framework, начиная с .NET Framework 4.7. Как правило, это достаточно для большинства приложений Windows Forms. Однако вы можете отказаться от одного или нескольких отдельных функций. Наиболее важной причиной этого является то, что существующий код приложения уже обрабатывает эту функцию. Например, если приложение обрабатывает автоматическое масштабирование, может потребоваться отключить функцию автоматического изменения размера следующим образом:
<configuration>
<!-- ... other xml settings ... -->
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
<add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
</System.Windows.Forms.ApplicationConfigurationSection>
</configuration>
Список отдельных ключей и их значений см. в элемента конфигурации Windows Forms.
Новые события изменения DPI
Начиная с .NET Framework 4.7, три новых события позволяют программно обрабатывать динамические изменения DPI:
- DpiChangedAfterParent, который запускается при программном изменении параметра DPI для элемента управления после события изменения DPI для родительского элемента управления или формы.
- DpiChangedBeforeParent, который срабатывает при программном изменении параметра DPI элемента управления до того, как произойдет событие изменения DPI для родительского элемента управления или формы.
- DpiChanged, который запускается при изменении параметра DPI на устройстве отображения, где в настоящее время отображается форма.
Новые вспомогательные методы и свойства
Платформа .NET Framework 4.7 также добавляет ряд новых вспомогательных методов и свойств, которые предоставляют сведения о масштабировании DPI и позволяют выполнять масштабирование DPI. К ним относятся:
LogicalToDeviceUnits, который преобразует значение из логического в пиксели устройства.
ScaleBitmapLogicalToDevice, который масштабирует растровое изображение до логического DPI для устройства.
DeviceDpi, который возвращает DPI текущего устройства.
Соображения о версиях
Помимо работы в .NET Framework 4.7 и Windows 10 Creators Update, ваше приложение также может работать в среде, в которой она не совместима с высокими улучшениями DPI. В этом случае вам потребуется разработать резервный вариант для приложения. Это можно сделать для выполнения пользовательских рисования для обработки масштабирования.
Для этого также необходимо определить операционную систему, в которой работает ваше приложение. Это можно сделать с помощью кода, как показано ниже:
// 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));
Обратите внимание, что приложение не сможет успешно обнаружить Windows 10, если он не был указан в качестве поддерживаемой операционной системы в манифесте приложения.
Вы также можете проверить версию .NET Framework, в которую было создано приложение:
Console.WriteLine(AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName);
См. также
.NET Desktop feedback