将主题应用于控件模板

时间:2011-05-17 22:43:15

标签: silverlight themes controltemplate

基本上我到目前为止的问题是我正在将控件模板修改为ComboBox,以便它看起来像我想要的那样。最重要的是,我们整个项目都使用ExpressionDark主题。问题是,当我在ComboBox上设置样式以便它使用我修改过的模板时,它会覆盖ExpressionDark样式。

我能想到的唯一解决方案是尝试在模板中取出任何明确的颜色,但这不起作用。还有OnApplyTemplate(),但我不确定应该如何使用它。

有人对如何解决这个问题有一些建议吗?

由于

1 个答案:

答案 0 :(得分:0)

您需要将自定义样式基于Expression Dark主题应用的隐式样式。您只能将一个隐式样式应用于元素。最重要的是,如果您显式设置Style属性,则不会应用任何隐式Style。

因此,如果你有表达暗主题的隐式样式:

<Style TargetType="ComboBox" ... />

自定义样式如:

<Style x:Key="MyStyle" TargetType="ComboBox" ... />

并像这样使用它:

<ComboBox Style="{StaticResource MyStyle}" ... />

然后你需要将MyStyle更改为基于隐式Style,所以它的Setters和Triggers也是这样应用的:

<Style x:Key="MyStyle" TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}" ... />

这显然要求可以从定义自定义样式的位置访问隐式样式资源。如果隐式Style在应用程序资源中,那么你应该很好。

编辑:

由于您使用的是Silverlight,因此不支持x:Type部分。您需要修改Expression Dark主题才能使其正常工作。

因此,如果你有表达暗主题的隐式样式:

<Style TargetType="ComboBox" ... />

您需要将其分解为两种样式:

<Style x:Key="ComboBoxBaseStyle" TargetType="ComboBox" ... />
<Style TargetType="ComboBox" BasedOn="{StaticResource ComboBoxBaseStyle}" />

然后你的自定义样式需要像这样修改:

<Style x:Key="MyStyle" TargetType="ComboBox" BasedOn="{StaticResource ComboBoxBaseStyle}" ... />

隐式Style不应包含任何Setter。一切都应该在ComboBoxBaseStyle版本中完成。