Почему абсолютный URI необходим для объединенных словарей в Generic.xaml? - PullRequest
10 голосов
/ 17 сентября 2010

Рассмотреть файл | Новый проект приложения WPF, содержащий:

  1. Новый пользовательский элемент управления с именем CustomControl1
  2. Два новых ресурсных словаря с именами Dictionary1 и Dictionary2

Возьмите сгенерированный стиль из Generic.xaml и переместите его в Dictionary2. Затем объедините Dictionary2 в Dictionary1 и Dictionary1 в Generic следующим образом:

<!--Generic.xaml-->
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/Themes/Dictionary1.xaml"/>
</ResourceDictionary.MergedDictionaries>

<!--Dictionary1.xaml-->
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Dictionary2.xaml"/>
</ResourceDictionary.MergedDictionaries>

Затем добавьте экземпляр CustomControl1 в сетку MainWindow. (Эта часть необходима для воспроизведения проблемы. Проект всегда хорошо компилируется - только во время выполнения проблема обнаруживается, и на словари следует ссылаться.)

В Dictionary1.xaml я объединяю другой dict в той же папке, поэтому работает простой Source = "Dictionary2.xaml". И все же в Generic.xaml я должен использовать абсолютный URI. Если я изменю вышеприведенный код на Source = "Dictionary1.xaml" без пакета pack: // application то я получу исключение XamlParseException, вызванное IOException "Не удается найти ресурс 'dictionary1.xaml" ", когда он пытается создать MainWindow.

Мой вопрос: Что особенного в generic.xaml относительно относительного разрешения URI и почему?

Ответы [ 2 ]

10 голосов
/ 12 октября 2011

Извините, потому что у меня нет возможности писать комментарии, поэтому я публикую это как ответ.

У меня такая же ситуация, и у меня все работает нормально.Мне не нужно помещать «pack: // application» в путь в Generic.xaml.Но только в том случае, если типом вывода сборки является «Приложение Windows».Для "библиотеки классов" мне нужно добавить имя сборки в путь (Source="/ClassLibarayAssemblyName;component/Themes/Dictionary1.xaml"), потому что без него механизм WPF пытается найти Dictionary1.xaml в основной сборке приложения.

Целевая структурав обоих случаях это «.NET Framework 4 Client Profile»

0 голосов
/ 18 сентября 2010

Просто предположение: generic.xaml также должен быть доступен из внешних сборок, так что это способ гарантировать, что ресурсы можно найти откуда угодно, используя абсолютные URI. Как я уже сказал, это просто удар в темноте, не уверен.

...