令人惊讶的Horizo​​ntalAlignment和Horizo​​ntalContentAlignment问题

时间:2015-11-16 10:32:44

标签: wpf

为什么StackA工作正常而不是下面代码片段中的StackB?

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <StackPanel x:Name="StackA">
        <Button Width="90"
                Height="50"
                HorizontalContentAlignment="Left">
            <Label Content="button" />
        </Button>
    </StackPanel>
    <StackPanel x:Name="StackB" Grid.Row="1">
        <Button Width="90" Height="50">
            <Label HorizontalAlignment="Left" Content="button" />
        </Button>
    </StackPanel>
</Grid>

enter image description here

AFAIK .. Horizo​​ntalAlignment是FrameworkElement的成员,应该通过引用它的父组成元素来对齐控件。

Horizo​​ntalContentAlignment是控件本身的成员,相应地对齐其自己的内容。

2 个答案:

答案 0 :(得分:3)

这是因为HorizontalContentAlignment的{​​{1}}默认值为Button

您的标签在其容器内保持对齐,但容器的大小足以容纳标签内容,因此对齐没有区别。然后按钮将该内容居中。

如果您将Center设置为HorizontalContentAlignment,您会看到标签在按钮内左对齐,因为它具有可以播放的整个按钮大小。

答案 1 :(得分:2)

ButtonContentPresenter,将其视为另一个Grid。这本身与Center的{​​{1}}对齐。

因此,当您将ButtonLabel对齐时,实际上位于Left,位于中心,因此对齐方式没有效果。

ContentPresenter会影响标签所在的HorizontalContentAlignment,而不会影响ContentPresenter本身。