我的自定义控件派生自ContentControl
,并具有类型为 FrameworkElement
的附加依赖项属性"附加内容"。此属性绑定到具有自定义样式资源的样式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
样式。这是正确的行为,因为风格继承(见这个答案(。所以我必须在我定义AdditionalContent
的地方应用样式。目前为止,一切都好。
但是奇怪的行为:当我省略将对象添加为逻辑子对象时,将应用样式。
为什么会这样?有没有一种正确的方法可以为AdditionalContent
中的所有内容提供样式,类似于定义Toolbar
样式?
很难说,因为您省略了大部分按钮定义,但请尝试将按钮的样式设置为将按钮类型作为资源键的动态资源。
<Button Style="{DynamicResource {x:Type Button}}"/>
像您所做的那样添加没有资源键的默认样式时,隐式键是数据类型。
通过将样式设置为动态资源,表明资源在运行时可能会更改,当您像现在一样在运行时将其插入树中时就是这种情况。