2010-01-05 7 views
9

he creado mi propia ControlTemplate de botón, de esta manera:WPF: ¿Por qué no debería usar {TemplateBinding Margin} en ControlTemplate? ¿El Margin está destinado solo para contenedores de elementos?

<Style x:Key="LightButtonStyle" TargetType="{x:Type ButtonBase}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ButtonBase}"> 
       <Border 
        x:Name="WrappingBorder" 
        Margin="{TemplateBinding Margin}" 
        ... 
        > 
        <ContentPresenter 
         Content="{TemplateBinding Content}" 
         ... 
         > 
        </ContentPresenter> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Ahora, he notado que cuando me puse margen al botón, como:

<Button 
    Style="{StaticResource LightButtonStyle}" 
    Margin="20" 
    > 
    Hello world! 
</Button> 

el botón tiene en realidad doble Margen - 40. Supuse que el control, de hecho, nunca usaría Margen, y que la propiedad Margen solo es leída por los antepasados ​​del botón durante la fase de organización. Luego busqué los estilos predeterminados de WPF y descubrí que ninguno de ellos usaba Margen.

¿Es esta la conclusión correcta (que el Margen tiene el control solo de estar correctamente organizado por contenedores)? En otras palabras, cada vez que utilizo {TemplateBinding Margin} en mi estilo, ¿tendré márgenes dobles en su lugar? ¿Y hay alguna lista de propiedades similares que mi control no debería usar (ya que solo están destinadas para 'mundo circundante')?

¿Me diría a la página de MSDN que explica esto? ¡Gracias!

EDIT:

supongo que debería encontrar respuestas en http://msdn.microsoft.com/en-us/library/ms745058.aspx y http://msdn.microsoft.com/en-us/library/ms751709.aspx, pero no creo que mencionan explícitamente que se trata de Nunca el control que utiliza la propiedad de margen, que es siempre el antecesor o sistema wpf que lo evalúa y lo usa para afectar el diseño ...

Respuesta

5

Su conclusión es correcta, si nos fijamos en las plantillas predeterminadas provistas por el framework verá que el Margin dentro de la plantilla está destinado a el Padding propiedad del control.

+0

Gracias, me di cuenta de esto ... ¿Conoces alguna página msdn o blogpost que explique el papel de Margin (y tal vez otras propiedades específicas del diseño) en el diseño? Traté de googlearlo, pero no encontré una respuesta real. –

+1

Estoy seguro de que Google puede ayudarlo, pero diré (o mejor dicho, escribo) una cosa. El margen es utilizado por el contenedor en el paso de disposición del proceso de disposición, el contenedor colocará el elemento secundario en una posición derivada de sus alineaciones horizontales y verticales y su margen. –

+0

Gracias, eso es exactamente lo que quería, que salvo Margen, nunca debería usar s HorizontalAlignment y VerticalAlignment dentro de la plantilla. –

5

El margen se aplica automáticamente por el sistema de diseño, dentro de una plantilla de control debe usar Relleno en su lugar.

<Border x:Name="WrappingBorder" Margin="{TemplateBinding Padding}" ... /> 
+0

Aviad respondió primero (e insinuó la fase cuando se aplica el margen en un comentario posterior), así que acepté su respuesta, ¡pero también muchas gracias! –

Cuestiones relacionadas