当应用程序主题不是默认主题时,如何将WPF自定义控件与应用程序主题匹配?
我正在制作一个从ComboBox派生的自定义控件,我在创建主题时遇到了一些困难。我可以毫不费力地让它采用当前的OS主题,但当我在App.xaml中显式加载新主题时,派生控件仍然显示OS主题 我可以用最少的一组代码重现问题:当应用程序主题不是默认主题时,如何将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
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中选择的主题)加载样式。