为什么当WPF“高度”属性具有“自动”值时,它的行为是这样的?

时间:2013-10-01 12:33:11

标签: c# wpf

下午好!

我讨厌打扰你们,但我对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"

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

enter image description here

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

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

有人可以解释为什么窗口表现得像这样(我的意思是从它的高度所在的位置)。提前谢谢。

3 个答案:

答案 0 :(得分:2)

这实际上超出了WPF的范围。当您在XAML中使用Double.NaN(又名Auto)时,WPF会在调用Win32的CreateWindow时传递CW_USEDEFAULT。 Windows有一个(未记录的)算法用于放置和调整窗口大小,这就是你所看到的。

正如Raymond Chen明智地suggests,你不能依赖这样的未记录的API,所以要么使用SizeToContent,要么自己指定一个大小。请注意,您还可以使用MinWidthMinHeight属性。

答案 1 :(得分:1)

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

您可以阅读更多相关信息Use Automatic Layout Overview

表格的大小与屏幕洗脱非常相关

编辑

这是故意的和设计的:

MSDN

  

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

答案 2 :(得分: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下绘制400h。 “d:”如所述可忽略不计,因此它不固定在这些尺寸上。因此,当实际绘制表单时,它会执行自己的伏都教计算,以保持窗口按比例调整大小。

“d:DesignWidth”和“d:DesignHeight”与高度/宽度声明不同,其中高度/宽度应用为实际尺寸。

所以,这可能并不完全解释为什么/为什么,但它是我遇到的,并希望它可以解释你遇到的问题。

相关问题