WPF UserControl не может найти ресурс XAML в проекте ссылки
В моем проекте WPF я держу пользовательский контроль в отдельном проекте библиотеки. Пользовательский элемент управления обращается к ресурсам в отдельном файле XAML, например:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Resources/ViewResources.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- Local styles here -->
</ResourceDictionary>
</UserControl.Resources>
Файл ресурсов, ViewResources.xaml, находится в папке в проекте библиотеки управления с именем Ресурсы. Он имеет действие по умолчанию (страница) и настраиваемый инструмент (MSBuild: Compile).
Проблема заключается в том, что я ссылаюсь на библиотеку управления в своем приложении WPF и использую пользовательский элемент управления. Во время выполнения я получаю следующее исключение XamlParseException:
Set property 'System.Windows.ResourceDictionary.Source' threw an exception.
... который перекрывает IOException:
Cannot locate resource 'resources/viewresources.xaml'.
Как я могу это исправить? Я попытался изменить действие сборки файла ресурса на "контент" и скопировать его в выходной каталог (который работает для файлов и подобных "немых" ресурсов). Но безрезультатно. Кроме того, он не работает в пользовательском элементе управления.
Есть ли лучший способ указать путь?
Мне нужно переместить файл ресурса в проект приложения (я бы предпочел, чтобы он был в домене управления пользователями).
Ответы
Ответ 1
Нашел.
Оказывается, есть лучший способ указать путь, Pack URI. Я изменил XAML на следующее:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/RoutingManager;component/Resources/ViewResources.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- Local styles here -->
</ResourceDictionary>
</UserControl.Resources>
и это исправило его.
Ответ 2
Я думал, что стоит опубликовать это на всякий случай, если кто-то борется с той же проблемой, поскольку я потратил более двух часов на борьбу с синтаксисом и т.д., только чтобы найти, что решение было мертвым простым, но не таким очевидным:
Когда вы ссылаетесь на упакованный ресурс из другой библиотеки управления, он, кажется, отлично работает во время разработки и даже компилируется без ошибок, но не работает во время выполнения с ошибкой "Set property" System.Windows.ResourceDictionary.Source "ошибка исключения". Оказывается, что просто ссылаться на сборку ресурсов из вашей библиотеки управления недостаточно, вам также нужно добавить ссылку на сборку, содержащую словарь ресурсов, в основной сборке приложения, иначе, похоже, это не скомпилировать в приложение. (например, приложение для запуска (приложение с app.xaml) → Добавить ссылку → выберите сборку с указанными файлами/файлами ресурсов).
Надеюсь, это поможет!
Ответ 3
В моем случае у меня был ResourceDictionary и UserControl в одной и той же Библиотеке, но отдельно от основного приложения. То, что сработало для меня, указывало название сборки в формате, предложенном Адамом в комментарии, и мне пришлось изменить ResourceDictionary в проекте от Embedded Resource
до Page
. Я не пытался использовать формат pack://, но я предполагаю, что это тоже сработает.
<ResourceDictionary Source="/AssemblyName;component/Assets/MyResource.xaml"/>
Ответ 4
У меня была такая же ошибка (IOException - файл не найден), который стоил мне день моей жизни, и я никогда не вернусь.
Использование ни более простого "/assemblyname...", ни синтаксиса "pack://...." не работало для меня.
Я правильно ссылался на сборку ресурсов в моей главной сборке.
Ошибка исчезла, когда я изменил свой файл свойства ресурса xaml Build Action на "Resource", как указано выше.
Однако я столкнулся с исключением XamlParseException в этой строке:
<ImageBrush x:Key="WindowBackground" ImageSource="Images/gradient.png" />
(который я напечатал вручную).
Это оставило файл ресурсов xaml, который я пытался включить с эффективной недопустимой зависимостью.
Как ни странно исправление заключалось в том, чтобы удалить свойство ImageSource, которое я набрал, повторно вставить его, но выберите изображение из раскрывающихся меню, которые появляются в результате.
Несмотря на то, что результирующая строка выглядит точно так же, это явно не так.
Не нравится WPF (VS2013), но надеюсь, что это поможет.
: 0/
Ответ 5
У меня была такая же ситуация, но URI пакета не помогли мне, я все еще получал исключение "Не могу найти ресурс..." в проекте реферирования (исполняемого файла). Что мне помогло, это настройка файлов ResourceDictionary в проекте пользовательской библиотеки управления как Embedded Resource.