Как я могу получить resources / Resources.xaml из исполняемой сборки? - PullRequest
1 голос
/ 08 июня 2011

У меня есть ResourceDictionary в resource / Resources.xaml.Тем не менее, я не знаю заранее, как будет называться имя .dll.Есть ли способ генерировать URI для ResourceDictionary на лету?Первоначально он был загружен с использованием

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, если я включу файл в другой проект.

Обновление. Поворотом ресурса.xaml со страницы в встроенный словарь, я смог загрузить его, используя

// 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);
    }
}

Но это немного неудовлетворительно.Тем не менее, было бы интересно узнать, есть ли способ сохранить его как страницу и загрузить его.

1 Ответ

2 голосов
/ 08 июня 2011

Вы должны иметь возможность создать URI на основе текущей сборки.Таким образом, используя совет Яна-Питера, пример будет:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...