我的Windows设置被设置为DPI为96.但是,当我创建以下Window
时,它将比我的屏幕(设置为1920 * 1080分辨率)小一点:
<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>
根据this msdn博客文章:
1个设备无关像素= 1/96英寸 1个物理像素= 1 / DPI(取决于系统DPI)
默认系统设置通常选择DPI为96,因此这两种像素的大小相同。
然而,情况似乎并非如此,因为我的Window
显然小于1920像素宽
如果我最大化Window
并检查其ActualWidth
,则看似1936
。
为什么会这样?
答案 0 :(得分:5)
问题更多的是:
为什么Window.ActualWidth报告的宽度似乎不是真实的&#39;窗口的宽度?
答案是看起来像窗口的整个宽度并不完全是完整的宽度。
当您设置Width
时,查询ActualWidth
,甚至使用GetWindowRect
来获取&#34; no-lies,Windows认为我的宽度是什么&#34;,您正在设置或获取窗口的宽度,包括不可见部分。
这些不可见的部分,特别是在Windows 10上,包含一些额外的空间,使用户可以轻松调整窗口的大小,即使它们稍微偏离边界:
(请注意,我的鼠标不在边框上,而是在右边有点偏离)
这意味着当你最大化你的窗户时,你的宽度仍然是&#34;填充&#34;使用那个不可见的空间,因此您的窗口大小将大于您的屏幕大小。
如何检索额外空间的宽度? SM_CXSIZEFRAME
与SM_CXPADDEDBORDER
和int extraBorderStuff = GetSystemMetrics(SystemMetric.SM_CXSIZEFRAME)
+ GetSystemMetrics(SystemMetric.SM_CXPADDEDBORDER);
double realWidthForSure = ActualWidth - borderSize * 2;
的{{3}}是您的朋友(示例包含来自GetSystemMetrics
的代码):
realWidthForSure
如果您随后最大化了窗口,则应注意<video>...</video>
应该等于您期望的1920px。
答案 1 :(得分:3)
窗口的宽度实际为1936像素!
当窗口最大化时,会裁剪其周围的边框。虽然它不再可见,但它仍被视为窗口的一部分。在Aero主题中,这个边框的每边宽度为8px,因此额外增加了16px:
如果切换到经典主题,每侧只有4像素,因此您的窗口宽度为1928像素。
答案 2 :(得分:-1)
您的屏幕规格是什么?例如我的显示器间距= 0.282毫米;等于90.0709 ... ppi。在WPF中,1920像素宽的窗口的实际宽度为2,046个单位。
确定您的屏幕的DPI(如果您的音高为mm,则为25.4 /音高)
96 / DPI * 1920 =&gt;实际宽度