如何将模板绑定到BorderThickness.Top(或Bottom或Left或Right)?

10

我想知道是否可能将 BorderThickness.Top 这样的结构元素绑定到 TemplatedParent 的对应属性。我已经尝试过

<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>
我想这样做的原因是我希望左右为0,只有上下受限。提前感谢。
2个回答

16

这是不可能的,因为Thickness是值类型 - 你只能在依赖对象的依赖属性上创建绑定。

你可以像普通绑定一样绑定BorderThickness:

<Border Margin="0" 
        Padding="{TemplateBinding Padding}" 
        BorderBrush="{TemplateBinding BorderBrush}"
        BorderThickness="{TemplateBinding BorderThickness, Converter={StaticResource ThicknessConverter}}" />

然后使用转换器返回一个适当修改过的 Thickness:

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 );
}

您甚至可以使用ConverterParameter来指定要清除的Thickness的哪些部分。


啊哈……非常感谢您快速而准确的回复……我最近学习了依赖属性……我怎么可能会忘记呢?! - mg007

1

使用转换器的解决方案是正确的。

如果您只对一个值感兴趣,在不使用转换器的情况下,可以直接在XAML中进行操作。 {TemplateBinding …} 只是一种语法糖,具有有限的功能,相当于 {Binding RelativeSource={RelativeSource TemplatedParent} …}

例如,一些自定义边框:

<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>

1
这不起作用,因为Thickness.Top不是一个DependencyProperty。它会导致XAMLParseException。 - FlyingFoX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接