心态决定输赢 发表于 2023-7-27 12:52:29

[C#]WPF 分辨率的无关性的问题

什么是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%一致。

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

来源:https://www.cnblogs.com/mrf2233/archive/2023/07/27/17582156.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: [C#]WPF 分辨率的无关性的问题