Динамическая загрузка файлов словаря ресурсов в приложение wpf выдает ошибку - PullRequest
8 голосов
/ 17 мая 2011

Я пытаюсь добавить файл ресурса xaml динамически, используя инструкцию,

Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("resources/leaf_styles.xaml", UriKind.Relative) });

Это исключение, Невозможно найти ресурс 'resources / leaf_styles.xaml'.

Я добавил файл leaf_styles.xaml в проект в папке ресурсов, и для BuildAction установлено значение «Content», для CopyAlways установлено значение True. Тем не менее я получаю эту ошибку. Может ли кто-нибудь помочь мне указать, что не так ??

Дополнительная информация -

  • Я не хочу вставлять файл xaml в качестве ресурса
  • Текущий проект - это проект библиотеки классов .net 3.5
  • Приведенный выше оператор mergedictionary написан в классе, принадлежащем тому же проекту
  • Я также добавил [assembly: AssemblyAssociatedContentFile ("resources / leaf_styles.xaml")] вручную, когда понял, что это не работает (для тестирования)

Обновление

Если я задаю его как абсолютное местоположение, оно работает правильно.

Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri(@"D:\foo\trunk\bin\resources\leaf_styles.xaml", UriKind.Absolute) });

Ответы [ 3 ]

26 голосов
/ 18 мая 2011

Наконец-то все заработало.Вот что я сделал,

  1. Прошел через 'http://msdn.microsoft.com/en-us/library/aa970069.aspx.
  2. Изменен шаблон Uri на

    var foo = new Uri("pack://siteoforigin:,,,/resources/leaf_styles.xaml", UriKind.RelativeOrAbsolute);
    Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = foo });
    
7 голосов
/ 17 мая 2011

Чтобы загрузить файл содержимого, вы можете вызвать метод GetContentStream класса Application, передав пакетный URI, который идентифицирует нужный файл содержимого.

Оформить заказ

http://msdn.microsoft.com/en-us/library/aa970494.aspx#Content_Files

EDIT

Я сделал это успешно, как это

    Uri uri = new Uri("Resources/MyDict.xaml", UriKind.Relative);
    StreamResourceInfo info = Application.GetContentStream(uri);
    System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
    ResourceDictionary myResourceDictionary = 
                                   (ResourceDictionary)reader.LoadAsync(info.Stream);
    Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary);
0 голосов
/ 01 февраля 2013

Я столкнулся с той же самой «проблемой пропавшего ресурса» и часами чесал голову.Затем я понял, что мое имя сборки содержит точки (.) И изменил имя сборки ресурса, снова протестировал, и это сработало.Это был файл изображения размером 16x16 png, который я хотел загрузить.Но я вижу, что пунктирные имена сборок вызывают ошибку для случаев сома и не вызывают ошибку для других случаев.

  • 1) Если вы загружаете стиль из ресурса, он работает
  • 2) Если вы загружаете изображение, оно не работает.Ресурс не найден.

Я использовал один и тот же код для обоих случаев, но результаты разные.Я не знаю, если это ошибка wpf.

...