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

首先得解什么是Dpi(Density independent 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%一致。

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

[C#]WPF 分辨率的无关性的问题的更多相关文章

  1. 论wpf的设备无关性 - 简书

    原文:论wpf的设备无关性 - 简书 WPF从发布之日起,一直将“分辨率无关(resolution independence)”作为其亮点,声称使用WPF制作的用户界面在轻巧的Ultra-Mobile ...

  2. WPF概述(硬件加速及分辨率无关性)

    一.名词解释 WPF(Windows Presentation Foundation),直译为Windows表示基础,是专门用来编写程序表示层的技术和工具. 大部分程序都是多层架构的,一般至少包含三层 ...

  3. 2000条你应知的WPF小姿势 基础篇<78-81 Dialog/Location/WPF设备无关性>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  4. WPF 与设备无关的单位

    WPF从发布之日起,一直将“分辨率无关(resolution independence)”作为其亮点,声称使用WPF制作的用户界面在轻巧的Ultra-Mobile PC的屏幕上和在50英寸的电视机上都 ...

  5. atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质

    atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质 #---语言的 工具和材料双重性 有的人说语言是个工具,有的人说语言是个材料..实际上语言同时属于两个属性. ...

  6. Java的平台无关性

    转载自:http://www.cnblogs.com/Y/archive/2011/03/22/JavaVM_Learning_Chapter2_Platform_Independence.html ...

  7. 深入Java虚拟机读书笔记第二章平台无关性

    Java的体系结构对平台无关的支持 Java平台 Java的体系结构通过几种途径支持Java程序的平台无关性,其中主要是通过Java平台自己.Java平台扮演一个运行时Java程序与其下的硬件和操作系 ...

  8. 深入Java虚拟机(2)——Java的平台无关性

    一.平台无关性的好处 Java技术在网络环境下非常有用,其中一个关键理由是,用Java创建的可执行二进制程序,能够不加改变地运行于多个平台. 这样的平台无关性随之带来许多的好处.这将极大地减轻系统管理 ...

  9. Java 平台无关性的基石

    Java 在刚刚诞生之初就提出过一个非常著名的口号:"一次编写,到处运行", 这句话充分表达了软件开发人员对冲破平台界限的渴望 在竞争激烈的 IT 领域,各种不同的硬件体系结构和不 ...

  10. Java虚拟机的平台无关性与语言无关性

    平台无关性 不同平台的不同java虚拟机,都执行同一种字节码文件,即Class文件 语言无关性 Java虚拟机不止能执行java程序,还有Clojure.Groovy.JRuby.Jython.Sca ...

随机推荐

  1. 2023-03-10:YUV420P像素数据编码为JPEG图片,请用go语言实现。

    2023-03-10:YUV420P像素数据编码为JPEG图片,请用go语言实现. 答案2023-03-10: 方法一.使用 github.com/moonfdd/ffmpeg-go 库,基于雷霄骅的 ...

  2. Vue全局公共服务类mixin

    首先,简单介绍下mixin: Mixin是面向对象程序设计语言中的类,提供了方法的实现.其他类可以访问mixin类的方法而不必成为其子类 Mixin类通常作为功能模块使用,在需要该功能时"混 ...

  3. FreeSWITCH添加自定义endpoint

    操作系统 :CentOS 7.6_x64      FreeSWITCH版本 :1.10.9   日常开发过程中会遇到需要扩展FreeSWITCH对接其它系统的情况,这里记录下编写FreeSWITCH ...

  4. kafka的安装和基本操作

    基本概念 简介 Kafka 最初是由 LinkedIn 即领英公司基于 Scala 和 Java 语言开发的分布式消息发布-订阅系统,现已捐献给Apache 软件基金会.其具有高吞吐.低延迟的特性,许 ...

  5. .NET周报 【6月第3期 2023-06-18】

    国内文章 揭秘 Task.Wait https://www.cnblogs.com/eventhorizon/p/17481757.html Task.Wait 是 Task 的一个实例方法,用于等待 ...

  6. 【tvm解析】 Operator Strategy 机制

    本文地址:https://www.cnblogs.com/wanger-sjtu/p/15082871.html Relay Operator Strategy是建立Relay IR与TOPI算子库的 ...

  7. 一篇讲懂Java运行类型、编译类型和多态(面向对象语言精髓之一)

    对象:运行类型.编译类型和多态 1.搞清楚面向对象的运行类型和编译类型就掌握了对象的精髓,我们用举个例子 class Father { Father() { System.out.println(&q ...

  8. 【webpack系列】从基础配置到掌握进阶用法

    前言 本篇文章将介绍一些webpack的进阶用法,演示内容继承自上一篇文章的内容,所以没看过上一篇文章的建议先学习上一篇内容再阅读此篇内容,会更有利于此篇的学习- 文件指纹 文件指纹指的是打包输出的文 ...

  9. 《HelloGitHub》第 87 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  10. MySQL 存储引擎 InnoDB 内存结构之缓冲池

    缓冲池是主存储器中的一个区域,在访问 table 和索引数据时InnoDB会对其进行缓存.缓冲池允许直接从内存中访问频繁使用的数据,从而加快处理速度.在专用服务器上,通常将高达 80% 的物理内存分配 ...