Подтвердить что ты не робот

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'.

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

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

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

4b9b3361

Ответ 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.