C# 为什么WPF;高度“;属性的行为如下,当它有;“自动”;价值

C# 为什么WPF;高度“;属性的行为如下,当它有;“自动”;价值,c#,wpf,C#,Wpf,下午好 我不想打扰你们,但我对WPF中的window“height”属性没有什么疑问,因为它有“Auto”值。因为我想了解这里的情况。以下是XAML代码: <Window x:Class="WpfTest.MainWindow" x:Name="window" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.mi

下午好

我不想打扰你们,但我对WPF中的window“height”属性没有什么疑问,因为它有“Auto”值。因为我想了解这里的情况。以下是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>

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

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

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

谁能解释一下窗户为什么会这样(我是说从它的高度看)。提前感谢。

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

你可以阅读更多关于它的内容

表单的大小与屏幕分辨率密切相关

编辑

这是有意的,也是有意的:

属性形式。大小: 此属性的最大值受以下限制: 运行窗体的屏幕的分辨率。该值不能为空 在每个屏幕尺寸上大于12像素(水平+12 垂直方向+12)


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

你可以阅读更多关于它的内容

表单的大小与屏幕分辨率密切相关

编辑

这是有意的,也是有意的:

属性形式。大小: 此属性的最大值受以下限制: 运行窗体的屏幕的分辨率。该值不能为空 在每个屏幕尺寸上大于12像素(水平+12 垂直方向+12)


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

不管怎样,我发现当你运行一个没有高度/宽度的窗口,并且它在“正常”模式下运行时,它似乎启动了屏幕的3/4。。。如何/在何处确定此默认值我尚未找到。由于您指定的是宽度,因此它尊重您对给定宽度的请求,但似乎保留了“正常”高度

现在,如果您通过使用expression blend

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”不同于仅高度/宽度声明,其中高度/宽度作为实际尺寸应用


因此,这可能无法确切解释原因,但这正是我所遇到的,希望它能为你所遇到的情况提供一些线索。

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

不管怎样,我发现当你运行一个没有高度/宽度的窗口,并且它在“正常”模式下运行时,它似乎启动了屏幕的3/4。。。如何/在何处确定此默认值我尚未找到。由于您指定的是宽度,因此它尊重您对给定宽度的请求,但似乎保留了“正常”高度

现在,如果您通过使用expression blend

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”不同于仅高度/宽度声明,其中高度/宽度作为实际尺寸应用


因此,这可能无法确切解释如何/为什么,但这正是我遇到的问题,希望它能为您提供一些帮助。

这实际上不属于WPF的范畴。当您使用
Double.NaN
(在XAML中称为
Auto
)时,WPF在调用Win32时会传递
CW\u USEDEFAULT
。Windows有一个特定的(未记录的)算法来放置和调整窗口大小,这就是您看到的


正如Raymond Chen明智地指出的那样,您不能依赖这种未记录的API,因此可以使用
SizeToContent
或自己指定大小。注意:您还可以使用
MinWidth
MinHeight
属性。

这实际上超出了WPF的范围。当您使用
Double.NaN
(在XAML中称为
Auto
)时,WPF在调用Win32时会传递
CW\u USEDEFAULT
。Windows有一个特定的(未记录的)算法来放置和调整窗口大小,这就是您看到的


正如Raymond Chen明智地指出的那样,您不能依赖这种未记录的API,因此可以使用
SizeToContent
或自己指定大小。注意:您也可以使用
MinWidth
MinHeight
属性。

这里到底有什么奇怪的地方?它必须有一些高度。当我创建新WPF窗口时,默认高度是350,为什么当我删除此值时,它正好变为526?@MattBurland是的,但我认为他暗示他希望高度为50或接近。有关如何计算窗口大小的一些信息,请参阅。三
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"