当应用主题不是默认主题时,如何将WPF自定义控件与应用主题相匹配?

时间:2011-02-21 21:11:21

标签: wpf controls themes inheritance

我正在制作一个源自ComboBox的自定义控件,我在主题方面遇到了一些困难。我能够毫不费力地采用当前的操作系统主题,但是当我在App.xaml中显式加载新主题时,我的派生控件仍然显示操作系统主题。

我可以使用最少的代码集重现问题:

public class MyComboBox : ComboBox 
{
  static MyComboBox()
  {
    DefaultStyleKeyProperty.OverrideMetadata(typeof(MyComboBox), new FrameworkPropertyMetadata(typeof(MyComboBox)));
  }
}

然后在主题/ generic.xaml:

<Style TargetType="local:MyComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
</Style>

到目前为止一切顺利 - MyComboBox正确显示,并与当前主题相匹配。

但是当我添加到我的App.xaml时:

<ResourceDictionary>
  <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/PresentationFramework.Luna;V3.0.0.0;31bf3856ad364e35;component\themes/luna.normalcolor.xaml" />
  </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

...常规ComboBox将显示Luna chrome,但MyComboBox将继续显示当前主题(Aero,在我的情况下,但我也使用Classic测试过)。

我尝试添加&lt; Style&gt;标签为MyComboBox到Themes / luna.normalcolor.xaml和其他主题XAML文件,没有任何效果 - 只有&lt; Style&gt;从generic.xaml加载,无论我在App.xaml中指定了什么主题。(我的测试应用中的ThemeInfoAttribute错误)。

我已经确认它正在从aero.normalcolor.xaml(我的操作系统正在使用的主题)加载样式,而不是从luna.normalcolor.xaml(我在App.xaml中指定的主题)加载。

有人能指出正确的方向吗?或者我正在努力做不到的事情?谢谢!

2 个答案:

答案 0 :(得分:0)

您是否为AssemblyInfo.cs指定了正确的ThemeInfo属性设置?

答案 1 :(得分:0)

这只是猜测,但如果您使用DynamicResource会怎么样?