29

添付プロパティを使用してwpfキャンバスの要素を中央に配置するにはどうすればよいですか?

4

4 に答える 4

48

添付プロパティを使用する代わりに、XAML のみで Canvas 内の要素を中央に配置する方法を探していたので、この投稿に出会いました。

念のため、あなたは同じ理由で来ました:

<Canvas x:Name="myCanvas">
    <Grid Width="{Binding ActualWidth, ElementName=myCanvas}" 
          Height="{Binding ActualHeight, ElementName=myCanvas}">
        <Label Content="Hello World!"
               HorizontalAlignment="Center"
               VerticalAlignment="Center" 
        />
    </Grid>
</Canvas>

もう一つですが、

アーカイブしようとするものによっては、ここでのすべてのソリューションがトラップであることに注意してください。要素がCanvas階層内にあるという理由だけで、それ自体の一部にはなりませんCanvas。Aは描画するものであり、コントロールを配置するものではありません。したがって、これらのコントロールに API をCanvas使用することはできません。これは、明らかに孤立したオーバーレイのようなものだからです。CanvasGrid

分離されたオーバーレイが必要な場合Canvasは、これが背景ですが、このソリューションを使用するとよいでしょう。

于 2016-03-09T17:27:04.493 に答える
23

このようなもの。

double left = (Canvas.ActualWidth - element.ActualWidth) / 2;
Canvas.SetLeft(element, left);

double top  = (Canvas.ActualHeight - element.ActualHeight) / 2;
Canvas.SetTop(element, top);
于 2010-02-05T17:24:56.607 に答える
9

これを行う唯一の方法は、キャンバスのサイズを把握し、それに基づいてプロパティを設定することです。SizeChangedこれは、キャンバスのイベント ハンドラーを使用して行うことができます。

parentCanvas.SizeChanged += new SizeChangedEventHandler(parentCanvas_SizeChanged);

void parentCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
    parentCanvas.SetLeft(uiElement, (parentCanvas.ActualWidth - uiElement.ActualWidth) / 2);
    parentCanvas.SetTop(uiElement, (parentCanvas.ActualHeight - uiElement.ActualHeight) / 2);
}
于 2010-02-05T17:30:47.633 に答える
3

You can put the Canvas and the element you want to be centered inside a Grid :

<Grid>
    <Canvas Width="200" Height="200" Background="Black" />
    <Button Width="50" Height="20" > Hello
    </Button>
</Grid>
于 2013-11-22T14:50:53.717 に答える