(新加入WPF)我正在查看WPF示例:
<Window x:Class="Attempt_XAML.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<Label HorizontalAlignment="Center">A Button Stack</Label>
<Button HorizontalAlignment="Left">Button 1</Button>
<Button HorizontalAlignment="Right">Button 2</Button>
<Button Background="#FFA29494">Button 3</Button>
<Button>Button 4</Button>
</StackPanel>
</Window>在MS中的评论指出:
对于包含在一个HorizontalAlignment中的内容的VerticalAlignment和StackPanel,默认值都是拉伸的。
然而,结果看起来与我所期望的不一样。Button和Label不是垂直展开的,而是水平展开的(也就是说,它们没有在两个方向上填满Window的整个空间)为什么?
发布于 2014-01-31 00:03:36
按钮和标签不是垂直展开的,而是水平展开的(也就是说,它们没有在两个方向填满整个窗口空间)为什么?
要理解原因,您至少需要对面板有一个基本的理解。任何面板(如StackPanel )都使用度量值-安排周期来决定其子元素的布局:
StackPanel的主要特征是它有无限的空间--如果它的方向是Horizontal,则是无限的水平空间,如果是Vertical,则是无限的垂直空间。换句话说,它实际上并不注意它可以使用的大小(在它的方向上),而是声称有一个无限的空间。因此,回到您的例子中,即使子类的VerticalAlignment可能是Stretch,它们实际上也不能伸展到无限大的范围。
如果您需要一个扩展其子面板来填充可用空间的面板,那么Grid就是一个很好的例子(默认情况下,网格将为每个子节点分配相等的总高度份额--或者您可以使用星型尺寸来调整比例)。如果需要特殊的布局行为,还可以考虑创建自己的自定义面板。
编辑
澄清“无限空间”:我的意思是,StackPanel告诉它的子空间有无限的可用空间。如果你是一个按钮,标签等,并且有无限的可用空间,你会做什么?您可能只是占用了所需的最小空间,即使您的VerticalAlignment是“拉伸”的,对吗?这就是发生的事。与网格相反,网格告诉子控件它们有x(有限)空间--在这种情况下,按钮、标签等将填充所有的空间(如果它们的VerticalAlignment是“拉伸”的)。
为了说明上面的内容,以这个自定义控件为例:
public class TestControl : ContentControl
{
public string Description { get; set; }
protected override Size MeasureOverride(Size availableSize)
{
System.Diagnostics.Debug.WriteLine("Size available for '" + Description + "': " + availableSize.Height);
return base.MeasureOverride(availableSize);
}
}这实际上什么也不做,只是报告分配了多少空间给它。现在,将测试控件放在Grid和StackPanel中,并进行比较:
<Grid Height="50">
<Grid.RowDefinition />
<Grid.RowDefinition />
<local:TestControl Description="in Grid" />
<StackPanel Grid.Row="1" Height="10">
<local:TestControl Description="in StackPanel" />
</StackPanel>
</Grid>您将看到Grid将其CustomPanel (上面的第一个)的高度分配为25 (其高度的一半)。然而,StackPanel为它的CustomPanel指定了无限的高度。
发布于 2014-01-30 23:40:28
尽管对于包含在一个HorizontalAlignment中的Content和VerticalAlignment of Content来说,默认值都是可扩展的。但拉伸方向受Orientation属性控制。
如果Orientation设置为Vertical,那么堆栈中没有定义宽度值的所有项都将被拉伸。
https://stackoverflow.com/questions/21469270
复制相似问题