2009-11-26 9 views
7

Parece que la siguiente Elipse en ControlTemplate no obtiene el BorderThickness, pero ¿por qué?WPF: TemplateBinding to StrokeThickness of Shape no funciona?

<Window.Resources> 
    <ControlTemplate x:Key="EllipseControlTemplate" TargetType="{x:Type TextBox}"> 
     <Grid> 
      <Ellipse 
       Width="{TemplateBinding ActualWidth}" 
       Height="{TemplateBinding ActualHeight}" 
       Stroke="{TemplateBinding Foreground}" 
       StrokeThickness="{TemplateBinding BorderThickness}" /> 
       <ScrollViewer Margin="0" x:Name="PART_ContentHost" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
     </Grid> 
    </ControlTemplate> 
</Window.Resources> 
<Grid> 
    <TextBox 
     Template="{DynamicResource EllipseControlTemplate}" 
     Foreground="Green" 
     BorderThickness="15" /> 
</Grid> 

TemplateBinding a Foreground funciona bien, la elipse es de color verde. Pero para StrokeThickness no parece funcionar, ¿por qué?

Respuesta

4

BorderThickness no es tan fácil, es una estructura de tipo Thickness (y puede ser compuesto, como BorderThickness=".0,.0,2,2"), mientras que StrokeThickness propiedad es de tipo double.

Necesita IValueConverter para hacer que este enlace funcione.

+0

Disculpe, ya encontré la respuesta yo mismo. Vea la respuesta que escribí ... Probablemente quiso decir eso. – Ciantic

+0

Bueno para ti :) Aún así, el mío fue antes :) –

+0

¡Eso es cierto! Elegiré la tuya como solución si mencionas la diferencia de tipo, aquí está la clave. – Ciantic

1

No fue nombrando Gotcha: BorderThickness es el tipo de Thickness, y es StrokeThickness tipo de double. Entonces necesitamos IValueConverter.

0

También se puede utilizar la propiedad DataContext del Elipse:

<Ellipse DataContext="{TemplateBinding BorderThickness}" StrokeThickness="{Binding Top}" /> 

Espero que esto ayude!

12

Otra posible solución ... (porque me gusta usar sólo IValueConverters como último recurso, y cambiando el DataContext de la elipse puede ser que no funcione si lo necesita para ajustarse a otra cosa):

<Ellipse StrokeThickness="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderThickness.Top}" /> 

Esto es equivalente a la intención original (vincular al TemplatedParent), pero utilizando el marcado a mano permite especificar una ruta en lugar de solo una propiedad

+0

Nit-elija en esta gran respuesta: creo que 'BorderThickness.Left' en realidad es el valor preferido para usar, ya que es el primer valor. Ver [esta respuesta sobre el margen] (https://stackoverflow.com/a/8522026/1518546) pero [el orden es el mismo para el espesor] ​​(https://docs.microsoft.com/en-us/dotnet/api /system.windows.thickness#xaml-values). –

Cuestiones relacionadas