【问题标题】:Why are certain properties in a ControlTemplate not honored?为什么不支持 ControlTemplate 中的某些属性?
【发布时间】:2012-07-29 03:59:25
【问题描述】:

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

【问题讨论】:

    标签: .net wpf wpf-controls


    【解决方案1】:

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

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

    一个普通的绑定看起来像:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 优先级与此无关。
      • 是的,我误解了这个问题。
      猜你喜欢
      • 2011-08-29
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      相关资源
      最近更新 更多