如何从执行程序集中获取resources/resources.xaml

本文关键字:resources xaml 获取 集中 执行程序 | 更新日期: 2023-09-27 17:58:46

我在resource/Resources.xaml中有一个ResourceDictionary。但是,我不知道.dll的名称会是什么。有没有即时生成ResourceDictionation的uri?最初,它是使用加载的

var myResourceDictionary = new ResourceDictionary();
var uri = new Uri("/xxx;component/resource/Resources.xaml", UriKind.Relative);
myResourceDictionary.Source = uri;
Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary);

其中,如果我将文件包含在另一个项目中,xxx可能会更改为yyy。

更新通过将Resource.xaml从Page变成Embedded Dictionary,我可以使用加载它

// http://chris.59north.com/post/Storing-application-wide-styles-in-external-files-aka-The-ExternalStyleManager.aspx
Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
foreach (var key in assembly.GetManifestResourceNames())
{
    if (key.ToLower().EndsWith(".resources.xaml"))
    {
        Stream resource = assembly.GetManifestResourceStream(key);
        ResourceDictionary dict = XamlReader.Load(resource) as ResourceDictionary;
        Application.Current.Resources.MergedDictionaries.Add(dict);
    }
}

但这有点不令人满意。仍然有兴趣知道是否有办法将其保留为页面并加载。

如何从执行程序集中获取resources/resources.xaml

您应该能够基于当前程序集构建URI。因此,使用Jan Peter的提示,一个例子是:

var myResourceDictionary = new ResourceDictionary();
var uriPath = string.Format("/{0};component/resource/Resources.xaml", 
    typeof(classInAssembly).Assembly.GetName().Name);
var uri = new Uri(uriPath, UriKind.RelativeOrAbsolute);
myResourceDictionary.Source = uri;
Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary);

但你可能需要使用长格式:

var uriPath = string.Format("pack://application:,,,/{0};component/resource/Resources.xaml", 
    typeof(classInAssembly).Assembly.Name);