我的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博客文章:

但是,由于我的Window明显小于1920像素宽,因此似乎并非如此。
如果我最大化Window并检查其ActualWidth,则它似乎是1936
为什么会这样呢?

最佳答案

问题更多的是:



答案是看起来像窗口的整个宽度并不完全是整个宽度。

当您设置Width,查询ActualWidth或什至使用GetWindowRect来获取“no-lies Windows认为我的宽度是多少”时,您正在设置或获取Window的宽度(包括不可见部分)。

这些不可见的部分,尤其是在Windows 10上,包括一些额外的空间,即使用户稍微偏离边界,也可以使用户轻松调整窗口的大小:

wpf - 为什么1920个独立于设备的单位不是96 DPI的1920像素?-LMLPHP

(请注意,我的鼠标不在边框上,而是稍微偏右)

这意味着,当您最大化窗口时,宽度仍被该不可见空间“填充”,因此窗口大小将大于屏幕大小。

如何获取多余空间的宽度?带有GetSystemMetricsSM_CXSIZEFRAME SM_CXPADDEDBORDER 是您的 friend (示例包括pinvoke.net中的代码):

int extraBorderStuff = GetSystemMetrics(SystemMetric.SM_CXSIZEFRAME)
                       + GetSystemMetrics(SystemMetric.SM_CXPADDEDBORDER);
double realWidthForSure = ActualWidth - borderSize * 2;

如果您随后将窗口最大化,则应该注意到realWidthForSure应该等于您期望的1920px。

关于wpf - 为什么1920个独立于设备的单位不是96 DPI的1920像素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36182487/

10-10 17:29