답변
이런 식으로 뭔가.
double left = (Canvas.ActualWidth - element.ActualWidth)/2;
Canvas.SetLeft(element, left);
double top = (Canvas.ActualHeight - element.ActualHeight)/2;
Canvas.SetTop(element, top);
내가이 일을 알고있는 유일한 방법은 캔버스의 크기를 파악하고 그 기반으로 속성을 설정하는 것입니다. 이것은 캔버스에 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);
}
이 이벤트는 창로드시 실행됩니다. –
네, 그래야합니다. 캔버스의 ActualWidth/ActualHeight 속성이 변경 될 때마다 실행됩니다. (레이아웃 업데이트 중) – Robin
좋아요. 하지만 Canvas.SetLeft 및 Canvas.SetTop이어야한다고 생각합니다. 부모 캔버스의 인스턴스가 아닙니다. –
당신은 당신이 그리드 내부에 중심을 할 캔버스와 요소를 넣을 수 있습니다 :
<Grid>
<Canvas Width="200" Height="200" Background="Black" />
<Button Width="50" Height="20" > Hello
</Button>
</Grid>
는이 게시물을 가로 질러왔다 왜냐하면 첨부 된 속성을 사용하는 대신 캔버스 내에서 요소를 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>
굉장! 이것은 "있는 그대로"작동하며 코드가 뒤 따르지 않습니다. 나는 Label 대신 UserControl을 중심으로 사용했습니다. –
내부에 느린 격자가 있습니다. 그리드가없는 솔루션이 좋을 것입니다. –
은이 연결된 속성으로 캔버스 클래스를 상속하는 클래스 내에서 쓸 수 있습니다. –