ModernUI教程:独立显示器DPI感知

Windows 8.1引入了独立显示器DPI感知功能,允许应用程序在不同DPI设置的显示器间无缝切换。此特性使得支持的应用程序能自动适应不同显示器的DPI设置,而未完全支持的应用则通过DPI虚拟化来适配。

         独立显示器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来实现:

image

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教程:目录

转载于:https://www.cnblogs.com/boyliupan/p/5374149.html

ModernUI(http://mui.codeplex.com/)是一个开源的WPF界面库,利用该界面库,我们可以创建很酷的应用程序。下面是ModernUI官方示例,你可以从官方网站直接下载源码运行,如果是.NET 4.0的话,记得要声明“NET4”预编译变量,否则无法编译通过。 这个界面框架是基于ModernUI来实现的,在该文我将分享所有的源码,并详细描述如何基于ModernUI来构造一个非常通用的、插件化的WPF开发框架。下载源码的同志,希望点击一下推荐。 本文将按照以下四点来介绍: (1)ModernUI简介; (2)构建通用界面框架的思路; (3)基于ModernUI和OSGi.NET的插件化界面框架实现原理及源码分析; (4)其它更有趣的东西~~。 要编写这样的WPF界面,我们需要在一个Window上声明菜单和Tab页面,下图是定义菜单的声明。 此外,每一个Tab风格页面,你也需要手动的为菜单创建这样的界面元素。 直接用这样的方式来使用ModernUI,显然不太适合团队协作性的并行开发,因为在一个团队的协作中,不同的人需要完成不同的功能,实现不同页面,每个人都需要来更改主界面。 我非常希望模块化的开发方法,因为这可以尽可能的复用现有资产,使程序员可以聚焦在自己关注的业务逻辑上,不需要关心UI的使用。下面,我将来描述基于ModernUI实现的一个通用界面框架,这个界面框架允许程序员在自己的业务模块中配置需要显示的界面元素。 通用界面框架实现思路: 我希望能够实现这样的通用界面框架: (1)程序员可以直接实现需要展现业务逻辑的界面,不需要关注如何使用ModernUI; (2)程序员可以通过简单的配置就可以将自己实现的业务逻辑页面显示在主界面中; (3)这个界面框架可以完全复用。 当我看到ModernUI这个界面库时,我希望将应用程序做成模块化,每一个模块能够: (1)通过以下配置能够直接显示二级菜单。 (2)通过以下配置能够直接显示三级菜单。 这样做的好处是,开发插件的时候可以不需要关心界面框架插件;团队在协作开发应用的时候,可以独立开发并不需要修改主界面;团队成员的插件可以随时集成到这个主界面;当主界面无法满足我们的布局时或者用户需求无法满足时,可以直接替换主界面框架而不需要修改任何插件代码。 最终的效果如下,以下界面的几个菜单及点击菜单显示的内容由DemoPlugin插件、DemoPlugin2插件来提供。当插件框架加载更多插件时,界面上会出现更多的菜单;反之,当插件被卸载或者被停止时,则相应的菜单将消失掉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值