Come TemplateBind a BorderThickness.Top (o inferiore o destra o sinistra)?
-
21-09-2019 - |
Domanda
Mi chiedo se è possibile associare un elemento di struttura come BorderThickness.Top alla proprietà corrispondente di TemplatedParent. Ho cercato
<Border Margin="0" Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}">
<Border.BorderThickness>
<Thickness Left="0" Right="0" Top="{TemplateBinding BorderThickness.Top}" Bottom="{TemplateBinding BorderThickness.Bottom}"/>
</Border.BorderThickness>
</Border>
Il motivo che voglio fare questo è che voglio sinistro e destro a 0 e solo Alto e basso vincolati.
Grazie in anticipo.
Soluzione
Questo non è possibile perché spessore è un valore di tipo - è possibile creare solo attacchi sulle proprietà di dipendenza degli oggetti di dipendenza.
Che cosa si potrebbe fare è vincolante BorderThickness come normale:
<Border Margin="0"
Padding="{TemplateBinding Padding}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness, Converter={StaticResource ThicknessConverter}}" />
quindi utilizzare un convertitore per restituire uno Spessore opportunamente modificato:
object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
{
var thickness = (Thickness) value;
return new Thickness( 0.0, thickness.Top, 0.0, thickness.Bottom );
}
Si potrebbe anche usare ConverterParameter per specificare quali parti dello spessore per cancellare.
Altri suggerimenti
La soluzione con convertitore è quella giusta.
Nel caso in cui si è interessati solo a un valore, è possibile farlo direttamente nel XAML senza un Convertitore . {TemplateBinding …}
è solo uno zucchero sintattico per {Binding RelativeSource={RelativeSource TemplatedParent} …}
con funzionalità limitate.
Ad esempio alcuni bordo personalizzato:
<Button BorderBrush="Purple"
BorderThickness="1 2 3 4"
Content="This is a button!">
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<DockPanel>
<Rectangle DockPanel.Dock="Left"
Width="{Binding BorderThickness.Left, RelativeSource={RelativeSource TemplatedParent}}"
Fill="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />
<Rectangle DockPanel.Dock="Top"
Height="{Binding BorderThickness.Top, RelativeSource={RelativeSource TemplatedParent}}"
Fill="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />
<Rectangle DockPanel.Dock="Right"
Width="{Binding BorderThickness.Right, RelativeSource={RelativeSource TemplatedParent}}"
Fill="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />
<Rectangle DockPanel.Dock="Bottom"
Height="{Binding BorderThickness.Bottom, RelativeSource={RelativeSource TemplatedParent}}"
Fill="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />
<ContentPresenter />
</DockPanel>
</ControlTemplate>
</Button.Template>
</Button>