2010-02-05 16 views

Respuesta

16

Algo como esto.

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

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

puede escribirse esta dentro de una clase que hereda una clase de tela como una propiedad adjunta. –

8

La única forma que conozco de hacer esto es para averiguar el tamaño del lienzo, y luego establecer las propiedades con sede fuera de eso. Esto puede hacerse utilizando un controlador de eventos para SizeChanged en el lienzo:

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

activará este evento al cargar la ventana. –

+0

Debería, sí. Se activará siempre que se modifiquen las propiedades ActualWidth/ActualHeight del lienzo. (es decir, durante la actualización del diseño) – Robin

+0

Genial. Pero creo que debería ser Canvas.SetLeft y Canvas.SetTop; no es la instancia del Lienzo padre. –

1

puede poner la lona y el elemento que desea estar centrado dentro de una cuadrícula:

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

me encontré con este post , porque estaba buscando una manera de centrar un elemento dentro de un lienzo en XAML solamente, en lugar de utilizar Propiedades adjuntas.

Por si acaso, que llegó por la misma razón:

<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

¡Impresionante! Esto funciona "tal cual", sin código detrás. Lo usé para centrar un UserControl, en el lugar de la etiqueta. –

+0

Ahora hay una red lenta dentro. Una solución sin una Grilla sería agradable. –

Cuestiones relacionadas