如何正确居中 WPF 画布

本文关键字:WPF 画布 何正确 | 更新日期: 2023-09-27 18:32:40

我有一个全屏对话框,想要居中画布。例如,它似乎适用于标签的垂直/水平对齐网格,但是当我尝试这样做时,左上角会居中而不是画布的中间:

<Window
    Title=""
    Topmost="True" WindowStyle="None" WindowState="Maximized"
    >
<Grid>
    <Grid VerticalAlignment="Center" HorizontalAlignment="Center">
        <Canvas>
            <Border Margin="20" 
                Background="White"
                BorderBrush="Black"
                BorderThickness="2"
                Padding="20" >
                <DockPanel Margin="10">
                    <StackPanel DockPanel.Dock="Top" Margin="0 0 0 50" 
                                Orientation="Vertical">
                       <Label FontSize="32" Content="Hello"></Label>
                    </StackPanel>
                    <StackPanel HorizontalAlignment="Right"
                                DockPanel.Dock="Bottom" 
                                Orientation="Horizontal">
                            <Label FontSize="32" Content="Hello"></Label>
                    </StackPanel>
                </DockPanel>
            </Border>
        </Canvas>
    </Grid>

如何正确居中 WPF 画布

这是因为您尚未在画布上设置宽度和高度,对于画布,实际宽度和实际高度属性(用于布局)默认为 0。

您可以通过在画布上设置背景来测试这一点 - 在您的情况下,由于上述原因,背景颜色不会呈现。

要解决此问题,请执行以下操作之一:

  1. 选择另一个容器(例如Grid),该容器可以根据孩子的尺寸进行调整
  2. 显式设置画布上的宽度和高度。

您可以将边框作为网格而不是画布的子项。(网格可以有多个子项)试试这个:

<Window             
    Title=""
    Topmost="True" WindowStyle="None" WindowState="Maximized"
    >
    <Grid>
        <Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <Rectangle Canvas.Left="40" Canvas.Top="31" Width="630" Height="41" Fill="Blue" />
            <Ellipse Canvas.Left="130" Canvas.Top="79" Width="580" Height="580" Fill="Blue" />
            <Path Canvas.Left="61" Canvas.Top="28" Width="133" Height="98" Fill="Blue" Stretch="Fill" Data="M61,325 L293,28" />
        </Canvas>
        <Border Margin="20" 
                HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Background="WhiteSmoke"
                BorderBrush="Black"
                BorderThickness="2"
                Padding="20">
            <DockPanel Margin="10">
                <StackPanel DockPanel.Dock="Top" Margin="0 0 0 50" Orientation="Vertical">
                    <Label FontSize="32" Content="Hello" />
                </StackPanel>
                <StackPanel HorizontalAlignment="Right"
                                DockPanel.Dock="Bottom" 
                                Orientation="Horizontal">
                    <Label FontSize="32" Content="Hello" />
                </StackPanel>
            </DockPanel>
        </Border>
    </Grid>
</Window>