0

如果我定义了 ControlTemplate:

<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">
<Border BorderBrush="Orange" BorderThickness="3" CornerRadius="2"
Background="Red" TextBlock.Foreground="White">
<ContentPresenter RecognizesAccessKey="True" Margin="{TemplateBinding Padding}"/>
</Border>
</ControlTemplate>

我把它绑定到一个按钮控件

<WrapPanel>
<Button Margin="10" Padding="5" Template="{StaticResource ButtonTemplate}">Test</Button>
</WrapPanel>

除非我包含 TemplateBinding 标记扩展,否则为什么不支持 Padding="5"?还有哪些其他属性被忽略,在什么情况下或我如何确定它们是否会被忽略或尊重?

另外,只是出于好奇,不是您愿意,而是您可以用普通的数据绑定表达式替换模板绑定并且它仍然可以工作吗?(如果是这样,路径是什么?)我仍在学习 WPF,只是想更深入地了解一些机制

4

2 回答 2

1

除非我包含 TemplateBinding 标记扩展,否则为什么不支持 Padding="5"?

这就是 WPF 的工作原理,模板控制它如何使用某些属性,系统无法判断模板中的哪个位置Padding需要在概念上有意义,因此您需要手动绑定它。除其他外,您应该绑定MarginBackground.

正常的绑定看起来像:

Margin="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}}" 
于 2012-07-29T04:13:52.647 回答
0

嗨,这是由于依赖属性的特性而发生的。依赖属性根据优先级获取其值,如下所示: 1)活动或动画 2)本地(即内联)值 3)模板值 4)样式值 5)默认值。现在,您在上面为(本地和模板化)设置了边距值,但本地值具有更高的优先级,因此应用了此值。这是为什么会发生的答案,所以我希望这会有所帮助。

于 2012-07-29T04:26:00.100 回答