2010-02-05 15 views

risposta

16

Qualcosa di simile.

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

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

può questo essere scritto all'interno di una classe che eredita una classe tela come proprietà associata. –

8

L'unico modo che conosco per fare questo è quello di capire la dimensione della tela, e quindi impostare le proprietà basate questa. Questo può essere fatto utilizzando un gestore di eventi per SizeChanged sulla tela:

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

questo evento si accenderà al caricamento della finestra. –

+0

Dovrebbe, sì. Verrà attivato ogni volta che vengono modificate le proprietà ActualWidth/ActualHeight della tela. (Ad esempio durante l'aggiornamento del layout) – Robin

+0

Grande. Ma credo che dovrebbe essere Canvas.SetLeft e Canvas.SetTop; non l'istanza della tela genitore. –

1

si può mettere la tela e l'elemento che si desidera essere centrato all'interno di una griglia:

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

mi sono imbattuto in questo post , perché stavo cercando un modo per centrare un elemento all'interno di una tela in XAML, invece di usare Proprietà allegate.

Solo nel caso, si è venuto per lo stesso motivo:

<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

Fantastico! Funziona "così com'è", senza codice dietro. L'ho usato per centrare un UserControl, nel posto dell'etichetta. –

+0

Ora c'è una griglia lenta dentro. Una soluzione senza una griglia sarebbe bella. –

Problemi correlati