我的自定义控件源自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
样式?
答案 0 :(得分:0)
很难分辨,因为你遗漏了很多按钮定义,但尝试将按钮的样式设置为动态资源,按钮类型为资源键。
<Button Style="{DynamicResource {x:Type Button}}"/>
在添加没有资源键的默认样式时,隐式键是数据类型。
通过将样式设置为动态资源,您指示资源可以在运行时更改,这是您在运行时将其插入树中的情况。