2010-02-05 36 views

Trả lời

16

Một cái gì đó như thế này.

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

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

này có thể được viết bên trong một lớp học mà được thừa hưởng một lớp vải như một tài sản gắn liền. –

8

Cách duy nhất tôi biết để làm điều này là tìm ra kích thước của canvas và sau đó đặt thuộc tính dựa trên đó. Điều này có thể được thực hiện bằng phương thức thụ lý sự kiện cho SizeChanged trên vải:

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

sự kiện này sẽ kích hoạt khi tải cửa sổ. –

+0

Nên, có. Nó sẽ kích hoạt bất cứ khi nào các thuộc tính ActualWidth/ActualHeight của canvas được thay đổi. (tức là trong khi cập nhật bố cục) – Robin

+0

Tuyệt vời. Nhưng tôi tin rằng nó sẽ là Canvas.SetLeft và Canvas.SetTop; không phải là thể hiện của Canvas gốc. –

1

Bạn có thể đặt các Canvas và yếu tố mà bạn muốn được tập trung bên trong một Lưới:

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

Tôi đã xem qua bài viết này , bởi vì tôi đã tìm kiếm một cách để căn giữa phần tử trong Canvas chỉ trong XAML, thay vì sử dụng Thuộc tính được đính kèm.

Chỉ trong trường hợp, bạn đến với cùng lý do:

<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

Tuyệt vời! Điều này làm việc "như là", không có mã phía sau. Tôi đã sử dụng nó để căn giữa UserControl, ở vị trí của Nhãn. –

+0

Bây giờ có một lưới chậm bên trong. Một giải pháp mà không có một Grid sẽ được tốt đẹp. –

Các vấn đề liên quan