2010-02-05 7 views

답변

16

이런 식으로 뭔가.

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

double top = (Canvas.ActualHeight - element.ActualHeight)/2; 
Canvas.SetTop(element, top); 
+0

은이 연결된 속성으로 캔버스 클래스를 상속하는 클래스 내에서 쓸 수 있습니다. –

8

내가이 일을 알고있는 유일한 방법은 캔버스의 크기를 파악하고 그 기반으로 속성을 설정하는 것입니다. 이것은 캔버스에 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); 
} 
+0

이 이벤트는 창로드시 실행됩니다. –

+0

네, 그래야합니다. 캔버스의 ActualWidth/ActualHeight 속성이 변경 될 때마다 실행됩니다. (레이아웃 업데이트 중) – Robin

+0

좋아요. 하지만 Canvas.SetLeft 및 Canvas.SetTop이어야한다고 생각합니다. 부모 캔버스의 인스턴스가 아닙니다. –

1

당신은 당신이 그리드 내부에 중심을 할 캔버스와 요소를 넣을 수 있습니다 :

<Grid> 
    <Canvas Width="200" Height="200" Background="Black" /> 
    <Button Width="50" Height="20" > Hello 
    </Button> 
</Grid> 
18

는이 게시물을 가로 질러왔다 왜냐하면 첨부 된 속성을 사용하는 대신 캔버스 내에서 요소를 XAML로만 가운데에 배치하는 방법을 찾고 있었기 때문입니다.

그냥 경우에, 당신은 같은 이유로 온 :

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

굉장! 이것은 "있는 그대로"작동하며 코드가 뒤 따르지 않습니다. 나는 Label 대신 UserControl을 중심으로 사용했습니다. –

+0

내부에 느린 격자가 있습니다. 그리드가없는 솔루션이 좋을 것입니다. –