WPF: TemplateBinding to Stroke Lo spessore della forma non funziona?
-
05-07-2019 - |
Domanda
Sembra che la seguente Ellisse in ControlTemplate non ottenga BorderThickness, ma perché?
<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
funziona bene, l'ellisse è verde. Ma per StrokeThickness
non sembra funzionare, perché?
Soluzione
BorderThickness
non è così semplice, è una struttura di tipo Spessore
(e può essere composita, come BorderThickness = " .0, .0, 2,2 "
), mentre la proprietà StrokeThickness
è di tipo double
.
È necessario IValueConverter
per far funzionare questa associazione.
Altri suggerimenti
Un'altra possibile soluzione ... (perché mi piace usare solo IValueConverters come ultima risorsa e cambiare il DataContext di Ellipse potrebbe non funzionare se è necessario che sia impostato su qualcos'altro):
<Ellipse StrokeThickness="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderThickness.Top}" />
Ciò equivale all'intento originale (per associare TemplatedParent), ma l'utilizzo del markup a mano lunga consente di specificare un percorso anziché solo una proprietà
C'era il nome del gotcha: BorderThickness
è il tipo di Thickness
e StrokeThickness
è il tipo di double
. Quindi abbiamo bisogno di IValueConverter
.
Puoi anche usare la proprietà DataContext di Ellipse:
<Ellipse DataContext="{TemplateBinding BorderThickness}" StrokeThickness="{Binding Top}" />
Spero che questo aiuti!