Wpf 为什么1920个设备独立单元不是具有96 DPI的1920像素?
我的Windows设置的DPI设置为96。但是,当我创建以下Wpf 为什么1920个设备独立单元不是具有96 DPI的1920像素?,wpf,screen-resolution,dpi,Wpf,Screen Resolution,Dpi,我的Windows设置的DPI设置为96。但是,当我创建以下窗口时,它将比我的屏幕(分辨率设置为1920*1080)小一些: 根据msdn博客文章: 1个设备独立像素=1/96英寸。 1个物理像素=1/DPI(取决于系统DPI) 默认系统设置通常选择96的DPI,因此这两种类型的像素大小相同 然而,情况似乎并非如此,因为我的窗口明显小于1920像素宽。 如果我将窗口最大化并检查其实际宽度,它似乎是1936 为什么会这样?您的屏幕规格是什么?例如,我的显示器的螺距为0.282毫米;等于90.0
窗口时,它将比我的屏幕(分辨率设置为1920*1080)小一些:
根据msdn博客文章:
1个设备独立像素=1/96英寸。
1个物理像素=1/DPI(取决于系统DPI)
默认系统设置通常选择96的DPI,因此这两种类型的像素大小相同
然而,情况似乎并非如此,因为我的窗口明显小于1920像素宽。
如果我将窗口最大化
并检查其实际宽度
,它似乎是1936
为什么会这样?您的屏幕规格是什么?例如,我的显示器的螺距为0.282毫米;等于90.0709。。。ppi。1920像素宽的窗口实际宽度为2046个单位(WPF)
确定屏幕的DPI(如果以毫米为单位,则为25.4/节距)
96/DPI*1920=>实际宽度该窗口的实际宽度为1936像素
当窗口最大化时,其周围的边框将被裁剪。虽然它不再可见,但仍被视为窗口的一部分。在Aero主题中,此边框每侧的宽度为8px,因此额外增加了16px:
如果切换到经典主题,则每侧仅为4px,因此您的窗口将为1928像素宽。问题更多的是:
为什么Window.ActualWidth报告的宽度似乎不是窗口的“真实”宽度
答案是看起来像窗户的全宽并不是全宽
当您设置宽度
、查询实际宽度
、甚至使用GetWindowRect
获取“无谎言windows认为我的宽度是多少”时,您正在设置或获取包含不可见部分的窗口宽度
这些不可见的部分,特别是在Windows 10上,包括一点额外的空间,以便用户可以轻松地调整窗口的大小,即使他们有点偏离边框:
(请注意,我的鼠标不在边框上,而是向右偏了一点)
这意味着当你最大化你的窗口时,你的宽度仍然被不可见的空间“填充”,因此你的窗口大小将大于你的屏幕大小
如何检索额外空间的宽度?使用SM\u CXSIZEFRAME
和SM\u CXPADDEDBORDER
是您在这里的朋友(示例包括以下代码):
如果您将窗口最大化,您应该注意到realWidthForSure
应该等于您期望的1920px。WPF如何知道我的显示器的物理DPI?根据链接的博客文章,它使用Windows的系统DPI,设置为96。但我的屏幕只有1920像素。窗口比你的屏幕宽。但它不是。两边都有空间。如果你在问题中添加一个屏幕截图会有所帮助。我已经弄明白了。你基本上是对的。Windows 10中有一个不可见的窗口边框,这让人非常困惑。因此,基本上,当我最大化窗口时,它会比屏幕大(因此宽度是1936
),因为边框是不可见的。明白了。@TimPohlmann是的;在回答中增加了一点说明。
<Window x:Class="WPF_Sandbox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPF_Sandbox"
mc:Ignorable="d"
Title="MainWindow"
Width="1920">
</Window>
int extraBorderStuff = GetSystemMetrics(SystemMetric.SM_CXSIZEFRAME)
+ GetSystemMetrics(SystemMetric.SM_CXPADDEDBORDER);
double realWidthForSure = ActualWidth - borderSize * 2;