2009-11-26 6 views
7

On dirait que l'Ellipse suivante dans ControlTemplate n'obtient pas BorderThickness, mais pourquoi?WPF: TemplateBinding to StrokeThickness of Shape ne fonctionne pas?

<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 à Foreground fonctionne très bien, l'ellipse est verte. Mais à StrokeThickness cela ne semble pas fonctionner, pourquoi?

Répondre

4

BorderThickness est pas facile, il est un struct de type Thickness (et peut être composite, comme BorderThickness=".0,.0,2,2"), tandis que StrokeThickness la propriété est de type double. Vous avez besoin de IValueConverter pour que cette reliure fonctionne.

+0

Je m'excuse, j'ai déjà trouvé la réponse. Voyez la réponse que j'ai écrite ... Vous vouliez probablement dire cela. – Ciantic

+0

Bon pour vous :) Pourtant, le mien était plus tôt :) –

+0

C'est vrai! Je choisirai la vôtre comme solution si vous mentionnez la différence de type, c'est la clé ici. – Ciantic

1

Il y avait dénomination gotcha: BorderThickness est le type de Thickness, et StrokeThickness est le type de double. Nous avons donc besoin de IValueConverter.

0

Vous pouvez également utiliser la propriété DataContext de l'Ellipse:

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

Hope this helps!

12

Une autre solution possible ... (parce que je préfère utiliser uniquement IValueConverters en dernier recours, et en changeant le DataContext du Ellipse ne fonctionne pas si vous avez besoin d'être réglé sur quelque chose d'autre):

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

Ceci est équivalent à l'intention originale (se lier au TemplatedParent), mais en utilisant le balisage à main longue vous permet de spécifier un chemin plutôt qu'une propriété

+0

Nit-pick sur cette bonne réponse: Je pense que «BorderThickness.Left» est la valeur préférée à utiliser car c'est la première valeur. Voir [cette réponse sur la marge] (https://stackoverflow.com/a/8522026/1518546) mais [la commande est la même pour l'épaisseur] (https://docs.microsoft.com/en-us/dotnet/api /system.windows.thickness#xaml-values). –