应用主题到WPF并使用样式。
应用主题到WPF并使用样式。
我正在尝试为一系列WPF项目应用主题。有一个包含generic.xaml和不同应用程序的程序集。据我所了解,我不能使用ThemeInfo属性和ResourceDictionaryLocation.ExternalLocation,因为名称必须与我的程序相同,但我有多个程序...
所以我搜索并发现我只需要在app.xaml中将字典作为MergedDictionary包含进去就可以了:
这基本上是有效的。但是,如果我为控件使用样式,它将不再应用generic.xaml样式:
ClassLibrary1.dll中的generic.xaml
程序中的窗口
我必须做什么,才能让WPF将我的generic.xaml样式作为所有按钮的基本样式(我知道我还必须编写ControlTemplate;上面的代码只是为了简单起见)?
问题的出现原因是想要在WPF中应用主题和使用样式,但是发现默认样式会从Aero主题恢复为Classic主题。解决方法是编写基于自定义标记的样式,并使用对应的MarkupExtension来应用当前主题的样式。具体的代码可以在这里找到:
public class ThemeResourceExtension : MarkupExtension { public ThemeResourceExtension() { } public ThemeResourceExtension(object resourceKey) { this.ResourceKey = resourceKey; } public object ResourceKey { get; set; } public override object ProvideValue(IServiceProvider serviceProvider) { if (this.ResourceKey == null) { var provideValueTarget = serviceProvider.GetService(); if (provideValueTarget != null) { var fe = provideValueTarget.TargetObject as FrameworkElement; if (fe != null) { return fe.FindResource(typeof(ThemeResourceExtension)); } } } else { var resourceKey = this.ResourceKey as Type; if (resourceKey != null) { return Application.Current.FindResource(resourceKey); } return Application.Current.FindResource(this.ResourceKey); } return null; } }
使用方法如下:
其中`local`是指向自定义命名空间的别名,`ButtonStyle`表示要应用的样式。
这样就可以在WPF中应用主题和使用样式,而且不会恢复为Classic主题。