我有一个应用程序设置,以便我可以在运行时调整其皮肤。我每次更换皮肤时都会这样做:
Uri uri = new Uri("SomeThemeAssembly;component/Themes/StandardTheme.xaml", UriKind.Relative)
Application.Current.Resources.MergedDictionaries.Clear();
ResourceDictionary resource = (ResourceDictionary)Application.LoadComponent(uri);
Application.Current.Resources.MergedDictionaries.Add(resource);
这很好用。
我还创建了一个自定义控件,其控件模板在Themes / Generic.xaml中定义,使用ComponentResourceKeys作为相关资源等。
x:Key="{ComponentResourceKey
TypeInTargetAssembly={x:Type local:MyCustomControl},
ResourceId=MyBrush}"
自定义控件本身的样式不使用componentresourcekey,因为我希望它为所有实例设置样式。
<Style TargetType="{x:Type local:MyCustomControl}">
再一次这一切都很好用,我用来组成自定义控件元素的标准控件在更换皮肤时都有适当的样式。
然而,我的控件上有许多自定义属性(画笔,宽度等)需要设置样式以适应我正在应用的外观。
在示例中,我看到使用标准的Windows主题添加了一个额外的文件
Luna.StandardColor.Xaml
例如,对于自定义控件的themes目录,允许在应用特定主题时设置和拾取修改后的控件模板。这对我来说无论如何都不适用,因为我的皮肤不是主题。
以我的方式使用“皮肤”时可以实现类似的效果吗?
显然我可以将Styles和ControlTemplates添加到我的皮肤组件中,但这感觉不对,特别是因为资源的皮肤组件有一个标准的命名约定。因此,如果它可以存储在我的自定义控件程序集中的Themes / StandardTheme.xaml中,则只需要一个更易于维护的样式。
在尝试阅读这个主题时,我有一个想要我想做的印象要么是不可能的,要么需要额外的腿部工作。
任何想法都赞赏。
答案 0 :(得分:1)
在CustomControls主题目录中添加MyNewTheme.xaml文件,该文件是具有为控件设置的隐式样式的资源字典。然后根据需要将该资源字典与您的另一个合并。例如:
Uri uri = new Uri("SomeThemeAssembly;component/Themes/MyNewTheme.xaml", UriKind.Relative)
Uri controlsUri = new Uri("ControlAssembly;component/Themes/MyNewTheme.xaml", UriKind.Relative)
Application.Current.Resources.MergedDictionaries.Clear();
ResourceDictionary resource = (ResourceDictionary)Application.LoadComponent(uri);
Application.Current.Resources.MergedDictionaries.Add(resource);
ResourceDictionary resource = (ResourceDictionary)Application.LoadComponent(controlsUri);
Application.Current.Resources.MergedDictionaries.Add(resource);