在DevExpress WPF主题中使用自定义资源

时间:2017-11-28 12:49:08

标签: c# wpf xaml devexpress

目的:

我有一个WPF项目,该项目将以DevExpress主题为主题。 有一个Login-UserControl应该有一个可能的背景图像。

实施

我做了一个自定义主题。在那个主题中,我有一个文件夹" CustomResources"在其中有一个图像,让我们称之为" Background.png"和一个" Brushes.xaml"它定义了一个像这样的ImageBrush:

<ResourceDictionary ...>
    <ImageBrush x:Key="{CustomThemeKeyAssembly:CustomThemeResourcesThemeKey ResourceKey=LoginBackgroundImageBrush, ThemeName=CustomTheme}" ImageSource="Background.png" />
</ResourceDictionary>

因此,我有一个共享程序集CustomThemeKeyAssembly,它派生了一个Custom ResourceThemeKey。

在项目中,我使用ApplicationThemeHelper

注册并设置主题
var theme = new Theme("CustomTheme")
{
    AssemblyName = "DevExpress.Xpf.Themes.CustomTheme.v17.2"
};
Theme.RegisterTheme(theme);

ApplicationThemeHelper.ApplicationThemeName = "CustomTheme";

我通过

引用资源
Background="{dxci:ThemeResource ThemeKey={CustomThemeKeyAssembly:CustomThemeResourcesThemeKey ResourceKey=LoginBackgroundImageBrush}}"

正如DevExpress知识库/支持所建议的那样。

问题

如果我添加这样的合并资源字典,则只能找到并显示资源:

ResourceDictionary loginBackgroundDictionary = new ResourceDictionary
{
    Source = new Uri($"pack://application:,,,/{MyProject.Properties.Settings.Default.ThemeAssembly};Component/CustomResources/Brushes.xaml", UriKind.Absolute)
};

//Add LoginBackgroundImageBrush Dictionary
Resources.MergedDictionaries.Add(loginBackgroundDictionary);

但是没有文章或例子提及必须这样做。所以我的印象是,我要么做错了,要么我错过了一些简单的步骤,比如将Brushes.xaml合并到一些ResourceDictionary中。

如果没有该片段,我会收到无法找到资源的警告。

问题

有没有人知道我哪里出错或者我缺少什么才能让这个工作没有最后一个片段?

仅供参考:我使用的是DevExpress 17.2.3,而ResourceKey程序集的目标是.net Framework 4.0

修改

与此同时,我尝试将Brushes.xaml添加到主题程序集中的Themes / Generic.xaml,如下所示:

<ResourceDictionary.MergedDictionaries>
    <dxt:ResourceDictionaryEx Source="/DevExpress.Xpf.Themes.Office2016WhiteSE.v17.2;component/Themes/ControlStyles.xaml" />
    <dxt:ResourceDictionaryEx Source="/DevExpress.Xpf.Themes.Office2016WhiteSE.v17.2;component/CustomResources/Brushes.xaml" />
</ResourceDictionary.MergedDictionaries>

它没有任何区别。与以前相同的行为。

1 个答案:

答案 0 :(得分:3)

问题解决了!

问题出在CustomThemeKeyAssembly

错误的实施

public class CustomThemeResourcesThemeKey : ThemeKeyExtensionBase
{
    public override Assembly Assembly => TypeInTargetAssembly != null ? TypeInTargetAssembly.Assembly : GetType().Assembly;
}

工作实施

public class CustomThemeResourcesThemeKey : ThemeKeyExtensionBase<ThemeResourcesThemeKeys> { }

分歧差异是Assembly属性的覆盖。默认实现使其工作。我这样做是因为它是在一个例子中完成的。支持告诉我坚持使用默认实现,并且它有效。