2009-11-26 18 views
7

è simile al seguente Ellipse in ControlTemplate non ottiene il BorderThickness, ma perché?WPF: TemplateBinding a StrokeThickness di forma non funziona?

<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 funziona bene, l'ellisse è verde. Ma a StrokeThickness non sembra funzionare, perché?

risposta

4

BorderThickness non è facile, è una struttura di tipo Thickness (e può essere composto, come BorderThickness=".0,.0,2,2"), mentre StrokeThickness struttura è di tipo double.

È necessario IValueConverter per fare questo lavoro vincolante.

+0

Mi scuso, ho già trovato la risposta. Vedi la risposta che ho scritto ... Probabilmente lo intendevi. – Ciantic

+0

Buon per voi :) Comunque, il mio era in precedenza :) –

+0

Questo è vero! Sceglierò la tua come soluzione se menzioni la differenza di tipo, è la chiave qui. – Ciantic

1

C'era denominazione Gotcha: BorderThickness è il tipo di Thickness, e StrokeThickness è il tipo di double. Quindi abbiamo bisogno di IValueConverter.

0

È inoltre possibile utilizzare la proprietà DataContext della Ellisse:

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

Spero che questo aiuti!

12

Un'altra possibile soluzione ... (perché mi piace utilizzare solo IValueConverters come ultima risorsa, e cambiando il DataContext del Ellipse potrebbe non funzionare se avete bisogno di essere impostato su qualcosa d'altro):

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

Questo è equivalente all'intento originale (associare al TemplatedParent), ma l'utilizzo del markup a mano lunga consente di specificare un percorso piuttosto che una proprietà

+0

Nit-pick in questa grande risposta: 'Penso BorderThickness.Left' in realtà essere il valore preferito utilizzare dal momento che è il primo valore. Vedere [questa risposta su margine] (https://stackoverflow.com/a/8522026/1518546), ma [l'ordine è la stessa per Spessore] (https://docs.microsoft.com/en-us/dotnet/api /system.windows.thickness#xaml-values). –

Problemi correlati