我的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上,包括一些额外的空间,即使用户稍微偏离边界,也可以使用户轻松调整窗口的大小:
(请注意,我的鼠标不在边框上,而是稍微偏右)
这意味着,当您最大化窗口时,宽度仍被该不可见空间“填充”,因此窗口大小将大于屏幕大小。
如何获取多余空间的宽度?带有GetSystemMetrics
和SM_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/