2010-02-05 2 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

Вы можете поставить Canvas и элемент, который вы хотите быть в центре внутри сетки:

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

Я наткнулся на этот пост , потому что я искал способ центрировать элемент внутри Canvas только в XAML, вместо использования Attached Properties.

Только в случае, вы пришли по той же причине:

<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

Удивительный! Это работает «как есть», без кода. Я использовал его для центрирования UserControl вместо метки. –

+0

Теперь внутри есть медленная сетка. Решение без сетки было бы неплохо. –

Смежные вопросы