代码之家  ›  专栏  ›  技术社区  ›  TomáÅ¡ Kafka

wpf:为什么我不应该在controlTemplate中使用模板绑定页边距-页边距仅用于元素的容器吗?

  •  9
  • TomáÅ¡ Kafka  · 技术社区  · 15 年前

    我为按钮创建了自己的控件模板,如下所示:

    <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>
    

    这个按钮实际上有两个边距-40。我假设控件实际上不应该使用页边距,并且在排列阶段,页边距属性只能由按钮的祖先读取。然后,我研究了WPF默认样式,发现没有人使用边距。

    这是正确的结论吗(只有通过容器才能正确安排裕度)?换句话说,每次我在样式中使用模板装订页边距时,我都会得到双倍的页边距? 是否有一些我的控件不应该使用的类似属性列表(因为它们只用于“周围的世界”)?

    你能给我指一下解释这个的msdn页面吗?谢谢您!

    编辑:

    我想我应该在 http://msdn.microsoft.com/en-us/library/ms745058.aspx http://msdn.microsoft.com/en-us/library/ms751709.aspx 但我认为他们没有明确提到 从未 使用Margin属性的控件,即 总是 评估并使用它来影响布局的祖先或WPF系统…

    2 回复  |  直到 15 年前
        1
  •  5
  •   Aviad P.    15 年前

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

        2
  •  5
  •   Bryan Anderson    15 年前

    页边距由布局系统自动应用,在控件模板中应使用填充。

    <Border x:Name="WrappingBorder" Margin="{TemplateBinding Padding}" ... />
    
    推荐文章