WPF:SystemParameters.WindowCaptionButtonHeight 返回的数字小于预期

问题描述 投票:0回答:2

我们有一个窗口,我们将 WindowChrome GlassFrameThickness 设置为负值,以便玻璃框架延伸到整个窗口。

这样,当我实际期望的值在 ~36 范围内时,SystemParameters.WindowCaptionButtonHeight 值返回 22。我提供了一些图片来显示当前和预期的行为应该是什么。

当前行为

预期行为

目前我正在通过使用 WindowCaptionButtonWidth 而不是高度来解决这个问题,因为它返回更多的预期值,但这感觉是错误的。

c# wpf windows-10
2个回答
2
投票

在 DWM 下,这些系统参数不再给出正确的值。您仍然可以通过将 SystemParameters.CaptionHeight、SystemParameters.WindowResizeBorderThickness.Left(或除 Top 以外的任何内容)和 SystemParameters.WindowNonClientFrameThickness.Left(或除 Top 以外的任何内容)相加来计算高度。

然而,在Windows 10这样的Per-Monitor DPI环境下,事情变得相当复杂。如果不正确修改System DPI和Per-Monitor DPI,这些系统参数将变得毫无用处。因此,如果您希望完全重新设计窗口,标题高度将成为每显示器 DPI 总体考虑因素的一部分。


0
投票

我也有同样的问题。我用一些解决方法解决了这个问题。背景是,你不能将高度设置为 0。它总是将其设置为最小高度,即标题和边框厚度的总和。所以这正是我们一直在寻找的。

因此,首先将表单高度设置为 0,然后只需添加您的内容所需的尺寸。

Form form = new Form();
from.Height = 0; // After this line you will see in a debugger
                 // that the form height is not 0, but set
                 // to the minimum height required by a window.
form.Height += 600; // where 600 pixels is the size of my own content.

如果您在运行时调整窗口大小时遇到问题,我建议您在程序开始时将

form.Height
设置为 0 后存储该值,以便稍后需要时使用该值。

Form form = new Form();
from.Height = 0;
public const int WINDOWMINHEIGHT = from.Height;
/* .. more code .. */
form.Height = WINDOWMINHEIGHT + 600; // set the new height to 600 px + window form height.

我希望这有帮助。我在 PowerShell 中使用它而不是在 C# 中。但由于都是 .NET,所以它的工作原理应该是一样的。

© www.soinside.com 2019 - 2024. All rights reserved.