2011-05-17 64 views
0

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

我能想到的唯一解决方案就是试着去掉模板中的任何明确的颜色,但这并不起作用。还有OnApplyTemplate(),但我不知道该如何使用它。

有没有人有一些建议,我该怎么做呢?

感谢

回答

0

您将需要立足于通过表达深色主题应用的隐式样式自定义样式。您只能将一个隐式样式应用于元素。最重要的是,如果你明确地设置了Style属性,那么不会应用隐式的Style。

所以,如果你有表达深色主题隐含的风格:喜欢

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

和一个自定义风格:

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

并使用它像这样:

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

然后,您需要将MyStyle更改为基于隐式样式,因此它的Setters和Triggers也会如此应用:

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

这显然要求可以从定义自定义样式的位置访问隐式Style资源。如果隐含的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}" ... /> 

隐式样式不应该在我有任何Setters吨。一切都应该在ComboBoxBaseStyle版本中完成。

+0

我在早些时候看过BasedOn,但我没有考虑将它与x:Type结合起来。然而,这种方法的问题是我使用Silverlight :(我的意思是我仍然可以使用BasedOn属性,但我认为我需要明确引用样式,但它在程序集中,所以我很困惑我会怎样 – MattMacdonald 2011-05-17 23:10:02

+0

@Matt - 对不起,没有注意到你有silverlight标签,'x:Type'在那里不起作用,很明显,会更新答案 – CodeNaked 2011-05-17 23:14:21

+0

也许我在这里做错了,但它不是真的按我期望的方式工作......我还应该提到我从Expression Blend本身构建了控制模板。它为我创建的ComboBox制作的控件模板明确定义了颜色方案(很多渐变等)。老实说,似乎只有这样,我才能在没有大量修改控件模板的情况下工作,就是在ComboBoxBaseStyle中使用BasedOn =“{somethingExpressionDark}”(会是什么)。 – MattMacdonald 2011-05-18 19:57:43