WPF: TemplateBinding to StrokeThickness of Shape no funciona?
-
05-07-2019 - |
Pregunta
Parece que la siguiente Elipse en ControlTemplate no obtiene el BorderThickness, pero ¿por qué?
<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 to Foreground
funciona bien, la elipse es verde. Pero para StrokeThickness
no parece funcionar, ¿por qué?
Solución
BorderThickness
no es tan fácil, es una estructura de tipo Thickness
(y puede ser compuesta, como BorderThickness = " .0, .0, 2,2 "
), mientras que la propiedad StrokeThickness
es de tipo doble
.
Necesita IValueConverter
para hacer que este enlace funcione.
Otros consejos
Otra solución posible ... (porque me gusta usar solo IValueConverters como último recurso, y cambiar el DataContext de Ellipse podría no funcionar si necesita configurarlo para otra cosa):
<Ellipse StrokeThickness="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderThickness.Top}" />
Esto es equivalente a la intención original (para enlazar con el TemplatedParent), pero usar el marcado de mano larga le permite especificar una ruta en lugar de solo una propiedad
Se nombró gotcha: BorderThickness
es el tipo de Thickness
, y StrokeThickness
es el tipo de double
. Así que necesitamos IValueConverter
.
También puede usar la propiedad DataContext de Ellipse:
<Ellipse DataContext="{TemplateBinding BorderThickness}" StrokeThickness="{Binding Top}" />
Espero que esto ayude!