2012-06-13 16 views
5

Existen diferencias entre el uso de SetValue con (por ejemplo) Canvas.LeftProperty y Margin Propiedad?Diferencias entre Canvas Property y Margen

Para ser más claro:

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

Es

rect.SetValue(Canvas.LeftProperty, 10) 

equivalente a

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

o no?

Respuesta

4

La propiedad Margen se usa con cada elemento para determinar el espacio adicional alrededor del objeto. Funciona en casi todos los tipos de maquetación (StackPanel, Grid, ContentControls, etc.)

La propiedad Canvas.Left (como también la parte superior, derecha e inferior) solo se aplica a los elementos que están directamente dentro de un lienzo. The Canvas usará estos valores para determinar dónde debe estar un objeto. Con los elementos de forma como una ruta, el lienzo también mira los datos de ubicación de la forma al determinar la posición.

Técnicamente, las propiedades adjuntas de Canvas deben acumularse con los datos de ubicación inherentes de una Forma (si existe) así como del Margen. Puede usar los 3 para modificar la posición. Pero generalmente tratarías de mantenerlo simple.

Por ejemplo, un rectángulo debe usar sus propiedades de ancho y alto, así como Canvas.Left y Canvas.Top. Una ruta simplemente se basaría en sus datos de puntos o la compensaría con Canvas.Left y Canvas.Top. No debe usar margen para elementos dentro de un lienzo ya que tiene un mejor control sin usarlo, pero técnicamente podría hacerlo.

1

Se ve igual pero en el primer caso el lienzo se mueve rect justo en 10 punto. En el segundo rect se mueve a la derecha en 10 punto.

Utilice uno de esta manera de acuerdo a sus propósitos.

EDIT: Si mira más profundamente en el código WPF. En el primer caso, rect se mueve en ArrangeOverride de Canvas en el segundo caso en ArrangeOverride de Rectangle.

+0

Bien, pero ¿cuál es la diferencia (si hay una)? – Nick

+0

Verifique mi respuesta editada. – RredCat

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

se aplican solo dentro del contenedor de lienzo, no alterarán el ancho y la altura del control al que se están adjuntando. (= Izquierda 10, derecha = 10 no se estira para dar un margen de 10 en cada lado)

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

es controlado por el objeto que ha sido activada, que va a funcionar fuera de un lienzo en una cuadrícula para ejemplo y alterará el ancho y la altura de cualquier control para imponer su valor (SI el ancho y la altura son NaN).

0

Puede usar la propiedad Margin dentro de su plantilla del objeto utilizando un enlace de plantilla o normal, ya que es una propiedad de dependencia. Esto también ajusta el ancho y la altura del objeto.

Las propiedades del lienzo son propiedades adjuntas al FrameworkElement y permiten el posicionamiento de elementos que pueden no tener una propiedad Margen.Y no funcionan si el objeto no tiene un elemento primario Canvas.

1

Para un elemento directamente en Canvas, la única diferencia está en los medios. El resultado final es exactamente el mismo.

Cuando se coloca el Rectangle, el motor de diseño agregará todos los valores que afectan su posición. Para la coordenada X esto incluye Canvas.Left y Margin.Left.

Entonces en un caso está agregando 10 + 0, y en el otro está agregando 0 + 10.

Así que ve con lo que prefieras. Personalmente prefiero Canvas.Left en esta situación, ya que parece tener más sentido contextual.