资讯 更多 >>
官宣!2023年哈萨克斯坦国际汽车及...
国家能源局:今年以来我国煤炭生产...
河南4名阳性人员私自返乡并瞒报情况...
山西吕梁:发现盗采矿产资源行为可举报
受害方律师:接法院通知,乐安命案...
橙色——“柑橘院士”邓秀新心中最...
刷视频相认的双胞胎姐妹:两次创业...
四川通报2021年秋冬季首批大气污染...
首轮筛查:天津73443人全部阴性!
首席气象预报员张霞:30年坚守筑牢...
动态更多 >>
[C#]WPF 分辨率的无关性的问题
2023年5月大宗商品-二氯甲烷价格分...
北特科技(603009):该股换手率大...
教育部公布普通高中课程方案 劳动...
“大圣当官”带您赏国粹学知识
绿色家园 初心践行
“星光计划”启动!流动少年宫走进...
智通ADR统计 | 7月12日
钛媒体科股早知道:解决具身智能“...
中国奥园:债权人小组成员已正式签...
会展 更多 >>
美籍酿酒师在崇礼:中国是第二故乡...
河南项城报告2名疑似新冠肺炎病例 ...
浙江绍兴确诊病例首次零新增 上虞...
广西东兴实行全员居家隔离 启动口...
新疆全方位推进乡村振兴 “富春山...
云南瑞丽市主城区全员核酸检测结果...
内蒙古满洲里累计治愈出院本土确诊...
孙海洋夫妻驱车山东阳谷:还在为孙...
大国工匠追梦“玉米强国”40载:用...
让南海“海洋热带雨林”斑斓多彩
专题报道 
当前位置: 动态 > >> 正文
 
[C#]WPF 分辨率的无关性的问题
来源:博客园     时间:2023-07-27 16:18:35

什么是WPF的分辨率无关性?

首先得解什么是Dpi(Densityindependent pixels ,设备无关像素),百度百科的解释DPI是指每英寸的像素,对应界面显示即是屏幕上每英寸的像素。

如标准的Windows DPI(96Dpi),代表1英寸96个像素。


(资料图片)

假设有一个96px*96px的按钮,如果在标准标准的Windows DPI的情况下看起来就是英寸的大小,如果在其他Dpi的情况下假设为192Dpi,实际只需要将原来的96px*96px按钮像素大小翻倍即可。

而WPF就是通过改变像素值来实现分辨率无关,具体公式如下:

[物理单位尺寸]=[设备无关单位尺寸]×[系统DPI]

其中设备无关单位尺寸值和Windows DPI的尺寸是一样的。上面那个例子变成公式就是

1/96英寸 * 192Dpi = 2px;而真实尺寸 = 设置的像素值 * 物理单位尺寸 即 96px*2px = 192px;

WPF分辨率无关的问题?

提一下我遇到问题的情况,我写了一个在图片上定位然后显示框的功能,然后那个框不是图片上的,而是一个组件,需要的是将框和定位点和长度传递给显示框。

图片很大,图片要适应程序的宽高,所以有个缩放值。然后图片长宽除缩放值的即为渲染到界面图片的大小。然后我想着计算出来框的定位点和长度,同理除缩放值就可以。

结果在我的电脑上运行正常,然后在其他电脑上运行,定位点和框大小都变大了。

最后测试是屏幕的缩放不同导致的。

对于图片显示在缩放后,WPF的真实尺寸是设置的像素值 * 物理单位尺寸。而给定的自定义控件属性是并不会乘物理单位尺寸,也就是缩放情况下是显示是正常的。导致实际像素得到了缩放。

解决方法其实很简单,在将框和定位点和长度除缩放值再除屏幕缩放值就可得到真实值。

而WPF中屏幕缩放值最简单的获取方法:

double screenscale = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width / SystemParameters.PrimaryScreenWidth;//windows     double screenscale1 = NSScreen.MainScreen.Frame.Width/ SystemParameters.PrimaryScreenWidth;//MacOs

后面发现 其实WPF因为分辨率无关性并不是真正的分辨率无关,当你导致你将屏幕比例缩放后,它将各个控件都放大了。

对于一些需求是,无论这么缩放,软件的实际渲染大小不应该改变。

例如先在1080p分辨率下创建一个WPF程序

界面设置为全屏化,只有两个按钮一个按钮高1000,一个按钮高80。

运行结果如下

然后改变缩放为125%

再运行结果如下

可以看到小按钮被挤出屏幕了。同理,我遍历button,然后将Button的大小除于缩放比例

private void StackPanel_Loaded(object sender, RoutedEventArgs e)        {            double screenscale = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width / SystemParameters.PrimaryScreenWidth;            if (sender is StackPanel panel)            {                foreach (Button button in panel.Children)                {                    button.Width /= screenscale;                    button.Height /= screenscale;                }            }        }

最后样式和缩放为100%一致。

如有问题,欢迎批评指正。

关键词:

热门推荐
猜你喜欢