独立显示器DPI感知,是在Windows 8.1中新增的特性,这个特性针对拥有多个显示器同时各个显示器的DPI设定又不同的人。对这个新特性做了优化支持的软件能够在一个高DPI的显示器移动窗口到另一个低DPI的显示器的时候实现完美自适应,反之亦然,自动适应对应的显示器的DPI。而对于不支持这个新特性的软件,哪怕是已经针对DPI调整做了优化的软件,系统都会利用DPI虚拟化来对软件界面进行像素拉伸放大或缩小(实际上放大与缩小采取了2种不同的方式,具体我就不说了),从而适应不同显示器的DPI。
支持:
在Windows 8.1之前,独立显示器DPI感知并不存在,操作系统提供了一个系统DPI,WPF自动支持。
在1.0.6版本以后,当操作系统支持时,Modern UI将会自动启用独立显示器DPI感知功能。新基类DpiAwareWindow实现了所有扩展到当前显示器DPI设置所必需的功能。ModernWindow和ModernDialog都派生自DpiAwareWindow。
要求:
ModernUI应用程序支持独立显示器DPI感知有两个要求:
1、显然主机操作系统必须是Windows 8.1或更高版本。如果ModernUI应用程序运行的操作系统不支持独立显示器DPI感知,它就会自动转切换到SystemDPI感知,这是WPF的默认设置。
2、为了在进程中启用PerMonitorDpiAwareness,它必须被初始化为DPI unaware。这可以通过在你的应用程序中添加以下代码到AssemblyInfo.cs来实现:
DPI API:
ModernUI公开的API可以用来查询当前的DPI设置。
DpiAwareWindow
DpiInformation属性
公开当前的DPI settings.DpiChanged事件和OnDpiChanged方法
当屏幕上的DPI 设置发生改变时被渲染。重写OnDpiChanged或处理DpiChanged事件来监视DPI的变化。例如你可以载入高/低DPI图像资源。ModernUIHelper
包含辅助方法用于获取和设置当前进程的DPI感知。
GetDpiAwereness方法
查询当前进程的DPI挂不照顾。返回DpiUnaware,SystemDpiAware或PerMonitorDpiAware
TrySetPerMonitorDpiAware方法
试图设置DPI感知为PerMonitorDpiAware。当主机操作系统不支持PerMonitorDpiAware时,将采用SystemDpiAware。进程中最初的DPI感知必须成功设置为DpiUnaware。任何失败的操作都会被丢弃,返回值标识操作是否成功。
该方法由DpiAwareWindow内部使用,不需要显式地调用这个方法。
ModernUI的独立显示器DPI感知的实现很大程度上是基于MSDN上的文章:开发一个Per-Monitor DPI-Aware WPF应用程序。
传送门:ModernUI教程:目录