下午好!
我讨厌打扰你们,但我对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"
在宽度之前一切都很完美,但是当我没有输入或删除默认高度时,窗口就有这种奇怪的外观。
属性“Height”的值为“Auto”。当我使用程序代码获取实际高度时,它是526。
MessageBox.Show(Convert.ToString(window.Height),"Height of the window");
有人可以解释为什么窗口表现得像这样(我的意思是从它的高度所在的位置)。提前谢谢。
答案 0 :(得分:2)
这实际上超出了WPF的范围。当您在XAML中使用Double.NaN
(又名Auto
)时,WPF会在调用Win32的CreateWindow
时传递CW_USEDEFAULT
。 Windows有一个(未记录的)算法用于放置和调整窗口大小,这就是你所看到的。
正如Raymond Chen明智地suggests,你不能依赖这样的未记录的API,所以要么使用SizeToContent
,要么自己指定一个大小。请注意,您还可以使用MinWidth
和MinHeight
属性。
答案 1 :(得分:1)
创建窗口时,默认高度设置为SizeToContent。指定自动时,它会占用所需的任何空间。那就是尽可能多地占用空间。这是默认值。
您可以阅读更多相关信息Use Automatic Layout Overview
表格的大小与屏幕洗脱非常相关
编辑:
这是故意的和设计的:
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”与高度/宽度声明不同,其中高度/宽度应用为实际尺寸。
所以,这可能并不完全解释为什么/为什么,但它是我遇到的,并希望它可以解释你遇到的问题。