WPF UserControl не может найти ресурс XAML в ссылочном проекте - PullRequest
18 голосов
/ 20 сентября 2010

В моем проекте WPF пользовательский элемент управления хранится в отдельном библиотечном проекте. Пользовательский элемент управления обращается к ресурсам в отдельном файле XAML, например:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Resources/ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- Local styles here -->
    </ResourceDictionary>
</UserControl.Resources>

Файл ресурсов ViewResources.xaml находится в папке в проекте библиотеки управления с именем Resources. Он имеет действие по умолчанию для сборки (Page) и пользовательский инструмент (MSBuild: Compile).

Проблема в том, что я ссылаюсь на библиотеку элементов управления в своем приложении WPF и использую пользовательский элемент управления. Во время выполнения я получаю следующее исключение XamlParseException:

Set property 'System.Windows.ResourceDictionary.Source' threw an exception.

... что оборачивает IOException:

Cannot locate resource 'resources/viewresources.xaml'.

Как я могу это исправить? Я попытался изменить действие сборки файла ресурсов на «содержимое» и скопировать его в выходной каталог (который работает для файлов и аналогичных «тупых» ресурсов). Но безрезультатно. Кроме того, тогда не работает свойство в пользовательском элементе управления.

Есть ли лучший способ указать путь?

Придется ли мне перемещать файл ресурсов в проект приложения (я бы предпочел этого не делать, поскольку он принадлежит домену пользовательского элемента управления).

Ответы [ 5 ]

26 голосов
/ 20 сентября 2010

Нашли.

Оказывается, есть лучший способ указать путь, Pack URIs . Я изменил XAML на следующее:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/RoutingManager;component/Resources/ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- Local styles here -->
    </ResourceDictionary>
</UserControl.Resources>

и это исправило.

24 голосов
/ 28 октября 2012

Я подумал, что стоит опубликовать это на тот случай, если кто-то еще столкнется с той же проблемой, так как я потратил более двух часов на борьбу с синтаксисом и т. Д., Только чтобы обнаружить, что решение было очень простым, но не настолько очевидным : При обращении к упакованному ресурсу из другой библиотеки элементов управления он, кажется, прекрасно работает во время разработки и даже компилируется без ошибок, но завершается с ошибкой во время выполнения с ошибкой «Установить свойство» System.Windows.ResourceDictionary.Source «вызвала исключение». Оказывается, что простой ссылки на сборку ресурса из вашей управляющей библиотеки недостаточно, вам также нужно добавить ссылку на сборку, содержащую словарь ресурсов в вашей основной сборке приложения , в противном случае кажется, что она не получает составлено в приложении. (т. е. запускаемое приложение (приложение с app.xaml) -> Добавить ссылку -> выбрать сборку с указанным файлом / файлами ресурсов).

Надеюсь, это поможет!

7 голосов
/ 02 октября 2014

В моем случае ResourceDictionary и UserControl находились в одной библиотеке, но отдельно от основного приложения.Для меня работало указание имени сборки в формате, предложенном Адамом в комментарии, и мне пришлось изменить ResourceDictionary в проекте с Embedded Resource на Page.Я не пытался использовать формат pack: //, но я предполагаю, что он тоже будет работать.

<ResourceDictionary Source="/AssemblyName;component/Assets/MyResource.xaml"/>
1 голос
/ 04 ноября 2014

У меня была та же ошибка ( IOException - файл не найден ), который стоил мне одного дня моей жизни, который я никогда не верну.

Не используя ни более простого " / assemblyname ..."и синтаксис" pack: //.... "у меня сработали.

Я ссылался на сборку ресурсов в моей основной сборкеправильно.

Ошибка исчезла, когда я изменил свое свойство Build Action файла ресурсов xaml на «Resource», как упомянуто выше.

Однако затем я столкнулся с XamlParseException в этой строке:

<ImageBrush x:Key="WindowBackground" ImageSource="Images/gradient.png" />

(который я набрал вручную).

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

Странно исправление состояло в том, чтобы удалить введенное мной свойство ImageSource, заново вставить его, НО выбрать изображение из выпадающего меню, которое появляется в результате.

Даже если результирующая строка выглядит точно так же,это явно не так.

Не нравится WPF(VS2013), но надеюсь, что это поможет.

: 0 /

0 голосов
/ 18 февраля 2014

У меня была такая же ситуация, но URI пакета не помогли мне, я все еще получал исключение "Не удается найти ресурс ..." в ссылочном (исполняемом) проекте.Мне помогло то, что мои файлы ResourceDictionary в проекте библиотеки пользовательских элементов управления были заданы как Встроенный ресурс .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...