Como modelar o BorderThickness.top (ou inferior ou esquerda ou direita)?
-
21-09-2019 - |
Pergunta
Gostaria de saber se é possível vincular um elemento de estrutura como a borderthickness. eu tentei
<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>
A razão pela qual eu quero fazer isso é que eu queira que a esquerda e a direita seja 0 e apenas a parte superior e inferior sejam ligadas.
Desde já, obrigado.
Solução
Isso não é possível porque a espessura é um tipo de valor - você só pode criar ligações nas propriedades de dependência dos objetos de dependência.
O que você poderia fazer é amarrar a borderhickness como normal:
<Border Margin="0"
Padding="{TemplateBinding Padding}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness, Converter={StaticResource ThicknessConverter}}" />
Em seguida, use um conversor para retornar uma espessura apropriadamente modificada:
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 );
}
Você pode até usar o ConverterParameter para especificar quais partes da espessura limpar.
Outras dicas
A solução com um conversor é a correta.
No caso em que você está interessado apenas em um valor, você pode fazer isso diretamente no Xaml sem a conversor. {TemplateBinding …}
é apenas um açúcar sintático para {Binding RelativeSource={RelativeSource TemplatedParent} …}
com uma funcionalidade limitada.
Por exemplo, alguma borda personalizada:
<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>