2012-06-13 14 views
5

Esistono differenze tra l'utilizzo di SetValue con (ad esempio) Canvas.LeftProperty e Margin Proprietà?Differenze tra proprietà del telaio e margine

Per essere più chiari:

<Canvas> 
    <Rectangle x:Name="rect">       
</Canvas> 

È

rect.SetValue(Canvas.LeftProperty, 10) 

equivalente a

rect.Margin = new Thickness(10, 0, 0, 0) 

o no?

risposta

4

La proprietà Margine viene utilizzata con ogni elemento per determinare lo spazio extra intorno all'oggetto. Funziona in quasi tutti i tipi di layout (StackPanel, Grid, ContentControls, ecc.)

La proprietà Canvas.Left (così come in alto, a destra e in basso) si applicano solo agli elementi direttamente all'interno di una tela. La tela utilizzerà questi valori per determinare dove deve essere un oggetto. Con gli elementi di forma come un percorso, la tela guarda anche i dati di posizione della forma quando si determina la posizione.

Tecnicamente, le proprietà associate alla tela devono accumularsi con i dati di posizione intrinseca di una forma (se presente) e il margine. Potresti usare tutti e 3 per modificare la posizione. Ma di solito proverai a mantenerlo semplice.

Ad esempio, un rettangolo deve utilizzare le sue proprietà di larghezza e altezza, nonché Canvas.Left e Canvas.Top. Un percorso si limiterebbe a fare affidamento sui suoi dati punto o lo compenserebbe con Canvas.Left e Canvas.Top. Non si dovrebbe usare il margine per gli elementi all'interno di una tela poiché si ha un controllo migliore senza usarlo, ma tecnicamente si potrebbe.

1

Sembra uguale ma nel primo caso la tela si sposta a rect proprio nel punto 10. Al secondo rect si sposta a destra nel punto 10.

Utilizzare uno di questi modi in base ai propri scopi.

EDIT: Se guardare più a fondo nel codice WPF. Nel primo caso rect viene spostato in ArrangeOverride di Canvas nel secondo caso in ArrangeOverride di Rectangle.

+0

Ok, ma qual è la differenza (se ce n'è una)? – Nick

+0

Controlla la mia risposta modificata. – RredCat

0
Canvas.Left 
Canvas.Right 
Canvas.Top 
Canvas.Bottom 

vengono applicate solo all'interno del contenitore di tela, non alterano la larghezza e l'altezza del controllo a cui sono collegate. (Sinistra = 10, destra = 10 non si estendono per dare un margine di 10 su ciascun lato)

Margin.Left 
Margin.Right 
Margin.Top 
Margin.Bottom 

è controllata dall'oggetto che è stato impostato, funzionerà al di fuori di una tela su una griglia per esempio e modificherà la larghezza e l'altezza di qualsiasi controllo per rafforzarne il valore (SE la larghezza e l'altezza sono NaN).

0

È possibile utilizzare la proprietà Margin all'interno del modello dell'oggetto utilizzando un oggetto TemplateBinding o Binding regolare in quanto DependencyProperty. Questo regola anche la larghezza e l'altezza dell'oggetto.

Le proprietà Canvas sono proprietà associate a FrameworkElement e consentono il posizionamento di elementi che potrebbero non avere una proprietà Margine.E non funzionano se l'oggetto non ha un genitore Canvas.

1

Per un elemento direttamente in un Canvas, l'unica differenza è nelle medie. Il risultato finale è esattamente lo stesso.

Quando si posiziona lo Rectangle, il motore di layout somma tutti i valori che influiscono sulla sua posizione. Per la coordinata X ciò include Canvas.Left e Margin.Left.

Quindi in un caso si aggiunge 10 + 0 e nell'altro si aggiunge 0 + 10.

Quindi, scegli quello che preferisci. Personalmente preferisco lo Canvas.Left in questa situazione in quanto sembra avere più senso dal punto di vista contestuale.