【发布时间】:2011-07-01 13:49:20
【问题描述】:
我正在制作从 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>
...常规的 ComboBox 将显示 Luna chrome,但 MyComboBox 将继续显示当前主题(在我的情况下是 Aero,但我也使用 Classic 进行了测试)。
我尝试将 MyComboBox 的 (在我的测试应用中与 ThemeInfoAttribute 错误)。
我已经确认它是从 aero.normalcolor.xaml(我的操作系统正在使用的主题)而不是从 luna.normalcolor.xaml(我在我的 App.xaml 中指定的主题)加载样式。
谁能指出我正确的方向?还是我试图做的事情是不可能的?谢谢!
【问题讨论】:
标签: wpf controls themes inheritance