我已经为按钮创建了自己的ControlTemplate,就像这样:
<Style x:Key="LightButtonStyle" TargetType="{x:Type ButtonBase}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ButtonBase}">
<Border
x:Name="WrappingBorder"
Margin="{TemplateBinding Margin}"
...
>
<ContentPresenter
Content="{TemplateBinding Content}"
...
>
</ContentPresenter>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
现在,我注意到当我给我的按钮设置外边距时,例如:
<Button
Style="{StaticResource LightButtonStyle}"
Margin="20"
>
Hello world!
</Button>
按钮实际上具有双倍的Margin - 40。我认为控件实际上应该从不使用Margin属性,并且在排列阶段,Margin属性只能被按钮的祖先读取。然后,我查看了WPF默认样式,并发现没有一个使用Margin。这是正确的结论吗(即Margin仅用于由容器正确排列)?换句话说,每次我在我的样式中使用{TemplateBinding Margin}时,我会得到双倍的边距吗?还有一些类似属性的列表,我的控件不应该使用吗(因为它们仅适用于“周围的世界”)?你能指向解释这个的MSDN页面吗?谢谢!
我猜我应该在http://msdn.microsoft.com/en-us/library/ms745058.aspx和http://msdn.microsoft.com/en-us/library/ms751709.aspx中寻找答案,但我认为它们没有明确提到控件从不使用Margin属性,而是总是祖先或wpf系统来评估并使用它来影响布局...