添加为LogicalChild时未应用ContentPresenter资源

时间:2017-11-16 09:15:11

标签: wpf xaml styles contentpresenter

我的自定义控件源自ContentControl,并且还有一个类型为FrameworkElement的附加属性“AdditionalContent”。
此属性绑定到具有自定义样式资源的样式ContentPresenter

<ContentPresenter ContentSource="AdditionalContent">
  <ContentPresenter.Resources>
    <Style TargetType="{x:Type Button}">
      ... some setters ...
    </Style>
  </ContentPresenter.Resources>
</ContentPresenter>

当我从这里的其他问题中学习时,我必须通过调用AddLogicalChild(AdditionalContent)并覆盖LogicalChildren属性来将此对象添加为我控制的逻辑子项。

现在,如果我像这样使用我的控件

<MyControl>
  <MyControl.AdditionalContent>
    <Button .../>
  </MyControl.AdditionalContent>
</MyControl>

Button的样式未应用。这是正确的行为,因为样式继承(参见this answer)。所以我必须在我定义AdditionalContent的地方应用样式。到现在为止还挺好。

但是奇怪的行为:当我不再将对象添加为逻辑子项时, 的样式被应用。
为什么会这样?是否有一种正确的方法为AdditionalContent内的所有内容提供样式,类似于定义Toolbar样式?

1 个答案:

答案 0 :(得分:0)

很难分辨,因为你遗漏了很多按钮定义,但尝试将按钮的样式设置为动态资源,按钮类型为资源键。

<Button Style="{DynamicResource {x:Type Button}}"/>

在添加没有资源键的默认样式时,隐式键是数据类型。

通过将样式设置为动态资源,您指示资源可以在运行时更改,这是您在运行时将其插入树中的情况。