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

当应用程序主题不是默认主题时,如何将WPF自定义控件与应用程序主题匹配?,wpf,controls,themes,inheritance,Wpf,Controls,Themes,Inheritance,我正在制作一个从ComboBox派生的自定义控件,我在创建主题时遇到了一些困难。我可以毫不费力地让它采用当前的OS主题,但当我在App.xaml中显式加载新主题时,派生控件仍然显示OS主题 我可以用最少的一组代码重现问题: public class MyComboBox : ComboBox { static MyComboBox() { DefaultStyleKeyProperty.OverrideMetadata(typeof(MyComboBox), new Frame

我正在制作一个从ComboBox派生的自定义控件,我在创建主题时遇到了一些困难。我可以毫不费力地让它采用当前的OS主题,但当我在App.xaml中显式加载新主题时,派生控件仍然显示OS主题

我可以用最少的一组代码重现问题:

public class MyComboBox : ComboBox 
{
  static MyComboBox()
  {
    DefaultStyleKeyProperty.OverrideMetadata(typeof(MyComboBox), new FrameworkPropertyMetadata(typeof(MyComboBox)));
  }
}
然后在Themes/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>

…一个常规的组合框将显示Luna chrome,但MyComboBox将继续显示当前主题(在我的例子中是Aero,但我也用Classic进行了测试)

我尝试将MyComboBox的标记添加到Themes/luna.normalcolor.xaml和其他主题xaml文件中,但没有效果——无论我在App.xaml中指定了什么主题,都只加载from generic.xaml。(我的测试应用程序中的MeInfo属性出错)

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


有人能给我指一下正确的方向吗?或者我想做的是不可能的?谢谢

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

这只是猜测,但是如果您改用DynamicResource呢?

事实上,我有ThemeInfo(ResourceDictionaryLocation.None,ResourceDictionaryLocation.SourceAssembly),这解释了为什么只加载generic.xaml。现在我已经解决了这个问题,它从其他XAML文件加载样式,但是我的控件仍然与应用程序主题不匹配。我已经确认它从Themes/aero.normalcolor.XAML(我的操作系统正在使用的主题)而不是Themes/luna.normalcolor.XAML(我在App.XAML中选择的主题)加载样式。