9

我为 Button 创建了自己的 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.aspxhttp://msdn.microsoft.com/en-us/library/ms751709.aspx中找到答案,但我没有'不认为他们明确提到使用 Margin 属性的从来不是控件,它始终是祖先或 wpf 系统评估它并使用它来影响布局......

4

2 回答 2

7

您的结论是正确的,如果您查看框架提供的默认模板,您会发现Margin模板内部绑定到Padding控件的属性。

于 2010-01-05T15:37:18.847 回答
5

边距由布局系统自动应用,在控件模板内您应该使用 Padding 代替。

<Border x:Name="WrappingBorder" Margin="{TemplateBinding Padding}" ... />
于 2010-01-05T17:21:14.497 回答