0

下午好!

我不想打扰你们,但是当它具有“自动”值时,我对 WPF 中的窗口“高度”属性几乎没有疑问。因为我想了解这里的事情是如何运作的。这是 XAML 代码:

<Window x:Class="WpfTest.MainWindow"
        x:Name="window"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Collapsed and Hidden buttons comparison" Width="500">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <StackPanel Height="50" Grid.Column="0" Margin="5,0">
            <Button Visibility="Collapsed">This is collapsed button</Button>
            <Button >Below collapsed button</Button>
        </StackPanel>
        <StackPanel Height="50" Grid.Column="1" Margin="5,0">
            <Button  Visibility="Hidden">This is hidden button</Button>
            <Button >Below hidden button</Button>
        </StackPanel>
    </Grid>
</Window>

当我使用显式高度时:

Height="300"

或者

 SizeToContent="WidthAndHeight"

在宽度之前一切都很完美,但是当我不输入或删除默认高度时,窗口就会出现这种奇怪的外观。

在此处输入图像描述

在属性中“高度”的值为“自动”。当我使用程序代码获取实际高度时,它是 526。

MessageBox.Show(Convert.ToString(window.Height),"Height of the window");

有人可以解释一下为什么窗口会这样(我的意思是它从哪里获取高度)。提前致谢。

4

3 回答 3

1

创建窗口时,默认高度设置为 SizeToContent 。当指定Auto时,它会占用它需要的任何/或仅空间。那就是尽可能多地占用空间。这是默认值。

您可以阅读有关它的更多信息使用自动布局概述

表格的大小与屏幕分辨率有很大关系

编辑

这是故意和设计的:

MSDN

属性 Form.Size:该属性的最大值受窗体运行的屏幕分辨率的限制。该值在每个屏幕尺寸(水平 + 12 和垂直 + 12)上不能大于 12 像素。

于 2013-10-01T12:40:33.700 回答
1

有时我也不明白 M$ 在幕后做了什么,但这是我对窗口高度/宽度的部分看法......如果你试图处理基于屏幕支持的 WPF 窗口,情况会变得更糟不同的放大倍数。您知道人们何时将较大的文本/图标大小从 100%、125% 和 150% 更改为设置。

无论如何,我发现当你运行一个没有高度/宽度的窗口并且它以“正常”模式运行时,它似乎启动了大约 3/4 的屏幕......它如何/在哪里确定这个默认我没找到。由于您指定了宽度,因此它尊重您对给定宽度的要求,但似乎保留了“正常”高度。

现在,如果您通过以下方式使用表达式混合

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" d:DesignWidth="350" d:DesignHeight="400"

这似乎告诉您的设计师我希望窗口以 350w x 400h 绘制。如上所述,“d:”是可忽略的,因此它不固定在这些尺寸上。因此,当实际绘制表单时,它会进行自己的巫术计算以保持窗口大小成比例。

"d:DesignWidth" 和 "d:DesignHeight" 不仅仅是一个高度/宽度声明,其中高度/宽度应用为实际尺寸。

所以,这可能不能完全解释如何/为什么,但它是我遇到的,并希望它可能对你遇到的事情有所帮助。

于 2013-10-01T13:00:26.457 回答
1

这实际上超出了 WPF 的范围。当您使用Double.NaNAuto在 XAML 中也称为)WPFCW_USEDEFAULT时,它会在调用 Win32 的CreateWindow. Windows 有一个特定的(未记录的)算法来放置和调整窗口大小,这就是你所看到的。

正如 Raymond Chen 明智地建议的那样,您不能依赖此类未记录的 API,因此请SizeToContent自己使用或指定大小。请注意,您还可以使用MinWidthMinHeight属性。

于 2013-10-01T15:44:28.990 回答