【问题标题】:how to properly center a WPF canvas?如何正确居中 WPF 画布?
【发布时间】:2013-09-24 05:10:43
【问题描述】:

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

<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>

【问题讨论】:

  • 那是因为你没有在画布上设置宽度和高度,在画布的情况下,ActualWidth 和 ActualHeight 属性(用于布局)默认为 0。跨度>
  • 你需要Canvas,可以用Grid代替吗?

标签: c# wpf


【解决方案1】:

这是因为您没有在画布上设置 Width 和 Height,并且在画布的情况下,ActualWidth 和 ActualHeight 属性(用于布局)默认为 0。

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

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

  1. 选择另一个容器(例如,网格),它会根据其孩子的大小进行调整
  2. 明确设置画布上的宽度和高度。

【讨论】:

    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2011-01-13
      • 1970-01-01
      • 2013-02-11
      • 2018-12-14
      • 1970-01-01
      • 2010-11-12
      • 2011-07-04
      • 1970-01-01
      • 2017-10-17
      相关资源
      最近更新 更多