独立显示器DPI感知,是在Windows 8.1中新增的特性,这个特性针对拥有多个显示器同时各个显示器的DPI设定又不一样的人。对这个新特性作了优化支持的软件可以在一个高DPI的显示器移动窗口到另外一个低DPI的显示器的时候实现完美自适应,反之亦然,自动适应对应的显示器的DPI。而对于不支持这个新特性的软件,哪怕是已经针对DPI调整作了优化的软件,系统都会利用DPI虚拟化来对软件界面进行像素拉伸放大或缩小(实际上放大与缩小采起了2种不一样的方式,具体我就不说了),从而适应不一样显示器的DPI。html
支持:windows
在Windows 8.1以前,独立显示器DPI感知并不存在,操做系统提供了一个系统DPI,WPF自动支持。
在1.0.6版本之后,当操做系统支持时,Modern UI将会自动启用独立显示器DPI感知功能。新基类DpiAwareWindow实现了全部扩展到当前显示器DPI设置所必需的功能。ModernWindow和ModernDialog都派生自DpiAwareWindow。优化
要求:操作系统
ModernUI应用程序支持独立显示器DPI感知有两个要求:
一、显然主机操做系统必须是Windows 8.1或更高版本。若是ModernUI应用程序运行的操做系统不支持独立显示器DPI感知,它就会自动转切换到SystemDPI感知,这是WPF的默认设置。
二、为了在进程中启用PerMonitorDpiAwareness,它必须被初始化为DPI unaware。这能够经过在你的应用程序中添加如下代码到AssemblyInfo.cs来实现:3d
DPI API:orm
ModernUI公开的API能够用来查询当前的DPI设置。htm
DpiAwareWindowblog
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教程:目录