Wpf 垂直对齐=“垂直对齐”;“伸展”;对于画布内部的标签不';行不通

Wpf 垂直对齐=“垂直对齐”;“伸展”;对于画布内部的标签不';行不通,wpf,xaml,canvas,.net-4.0,vertical-alignment,Wpf,Xaml,Canvas,.net 4.0,Vertical Alignment,如何将垂直对齐=“拉伸”与标签一起使用在画布中?我正在尝试将按钮中的文本“Cancel”居中,如下代码所示。为标签使用固定的高度和宽度不是理想的选项 <Button Name="buttonCancel" Width="80" Height="40" IsCancel="True" Padding="0" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> <Canvas>

如何将
垂直对齐=“拉伸”
标签一起使用在
画布中?我正在尝试将按钮中的文本“Cancel”居中,如下代码所示。为标签使用固定的高度和宽度不是理想的选项

<Button Name="buttonCancel" Width="80" Height="40" IsCancel="True" Padding="0" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
    <Canvas>
        <Label Canvas.Top="0" Canvas.Left="0" Padding="0" FontSize="10">Esc</Label>
        <Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">Cancel</Label>
    </Canvas>
</Button>

电子稳定控制系统
取消

A
Canvas
不会对其内容执行任何缩放布局;如果您想缩放内容,在本例中可以使用网格,默认情况下,网格将缩放
标签
两个元素以填充
内容
空间。

假设您需要固定性质的其他对象的画布,您可以将
画布
覆盖在
网格上,然后将标签放入网格中。您可以将标签放在画布之前,使其成为背景z索引(被画布对象覆盖),或放在画布之后,使其具有更高的z索引(将覆盖画布对象)。例如:

<Button Name="buttonCancel" Width="80" Height="40" IsCancel="True" Padding="0" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
    <Grid>
        <Label Padding="0" FontSize="10">Esc</Label>
        <Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">Cancel</Label>
        <Canvas>
            <!-- Your Canvas content here -->
        </Canvas>
    </Grid>
</Button>

电子稳定控制系统
取消

使用绑定到
画布的
实际宽度

<Canvas>
    <Label Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type Canvas}}, Path=ActualWidth}">...</Label>
</Canvas>

...

但是如上所述,如果您对动态拉伸布局感兴趣,
Canvas
并不是理想的控制选择。

重复我在评论中的解决方案,因为(a)您确实不想要
Canvas
,并且(b)听起来这解决了您的问题,因此,我将在其他人更容易看到的地方给出答案

Canvas
用于固定像素大小的布局,这可能是最不常见的情况。您应该将
画布
替换为
网格
,如下所示,以便两个
标签
在可用空间内动态(独立)布局:

<Grid>
    <Label Padding="0" FontSize="10">Esc</Label>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center">Cancel</Label>
</Grid>

电子稳定控制系统
取消

“使用固定的标签高度和宽度不是一个理想的选择。”那么为什么要使用
画布
?它只适用于固定大小的布局。这主要是因为我认为画布是唯一可以覆盖子控件的内容控件。是什么让你产生这种想法的?试试看:
对不起,我不清楚。我想要的是在一个按钮内有两个标签。一个是命令文本,如OK、Cancel等,另一个是加速键,如F2、ESC、Enter,原理是一样的。将
Canvas
替换为:
escancel
注意两个标签是如何在同一个空间中布局的,就像我前面示例中的两个
按钮一样?比强迫一个
Canvas
去做它不是专门为之设计的事情要简单得多,特别是从长远来看。