为什么ControlTemplate中的某些属性不受尊重?

时间:2012-07-29 03:59:25

标签: .net wpf wpf-controls

如果我定义了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,只是想深入了解一些机制

2 个答案:

答案 0 :(得分:1)

  

除非我包含TemplateBinding标记扩展名,否则为什么Padding =“5”不受尊重?

这就是WPF如何工作,模板控制它如何使用某些属性,系统没有办法在Padding需要进入模板的位置来判断从概念上理解所以你需要手动绑定它。除此之外,您应该绑定MarginBackground

正常绑定看起来像:

Margin="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}}" 

答案 1 :(得分:0)

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