【问题标题】:How to TemplateBind to BorderThickness.Top (or Bottom or Left or Right)?如何将模板绑定到 BorderThickness.Top(或底部或左侧或右侧)?
【发布时间】:2010-11-26 10:31:44
【问题描述】:

我想知道是否可以将像 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>

我想这样做的原因是我希望 Left 和 Right 为 0,并且只有 Top 和 Bottom 被绑定。

提前致谢。

【问题讨论】:

    标签: wpf binding templatebinding thickness


    【解决方案1】:

    这是不可能的,因为厚度是一种值类型 - 您只能在依赖对象的依赖属性上创建绑定。

    你可以做的是正常绑定 BorderThickness:

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

    然后使用转换器返回适当修改的厚度:

    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 指定要清除的厚度部分。

    【讨论】:

    • ahaa...非常感谢4您快速准确的回复...我最近了解了依赖属性...我怎么能忘记它?!
    【解决方案2】:

    带有转换器的解决方案是正确的。

    如果您只对一个值感兴趣,您可以直接在 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>
    

    【讨论】:

    • 这不起作用,因为Thickness.Top 不是 DependencyProperty。它会导致 XAMLParseException。
    猜你喜欢
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2016-02-18
    • 2015-04-05
    • 2018-12-24
    • 2020-09-09
    相关资源
    最近更新 更多