Невозможно ссылаться на источник изображения с относительным путем в xaml

Я создал проект ClassLibrary и добавил xaml типа Window. Я написал консольное приложение и покажу это окно wpf.

Проблема в том, что я должен показать значок в этом окне.

Если я использую следующий код, он не работает

<Image Source="../Images/Folder-icon.png"></Image>

Когда я даю некоторый жестко закодированный путь, как

<Image Source="E:\MyApp\Images\Folder-icon.png"></Image>

оно работает.

Почему я должен указать значение жесткого кодированного пути? Есть ли решение?

Надеюсь, я дал достаточно информации. Пожалуйста, помогите, я боюсь с этой проблемой более 2 часов.

Ответ 1

Если папка "Изображения" добавлена в тот же проект ее использования, это должно сработать для вас:

<Image Source="/Images/Folder-icon.png"/>

Или используйте Pack Uri специально:

<Image Source="pack://application:,,,/Images/Folder-icon.png"/>

Если образ находится в другом проекте, чем в текущем проекте, где находится ваш XAML, вам нужно использовать более подробное определение URI пакета, где вы должны указать имя сборки, где будет добавлено изображение.

<Image Source="pack://application:,,,/Assembly;component/Images/Folder-icon.png"/>

Замените сборку с фактическим именем сборки, в которое будет добавлено изображение.


Также убедитесь, что для параметра " Build Action установлено значение " Resource для файла Folder-icon.png.


ОБНОВЛЕНИЕ:

Более подробное определение Pack URI работает и в образце. Попробуйте это:

<Image Source="pack://application:,,,/ClassLibrary1;component/Folder-icon.png"/>

Ответ 2

Ответы на такие вопросы часто сбивают с толку, потому что принципы/предпосылки для решения проблемы не объясняются правильно. Это касается и текущего выбранного ответа.

Есть две вещи, которые следует учитывать:

1. Как объявить тип файла/ресурса, который вы добавляете в свой проект.

Это делается путем добавления соответствующей папки и файлов в проект с помощью Solution Explorer в VS, например, в подпапке Images:

enter image description here


и указание свойств для каждого добавленного файла (справа внизу):

enter image description here


Build Action установлен на Content, а Copy To Output Directory установлен на Copy if newer. Вот как следует добавлять файлы, если вы не хотите, чтобы они были встроены в сборку.

  • Для справки: параметр "Содержимое" является одним из возможных вариантов доступа к файлу в WPF. Другие параметры включают Ресурс (либо встроенный в текущую сборку, либо в другую сборку того же приложения) и Сайт происхождения для доступа к файлу, который не имеет отношения к текущему приложению:

    enter image description here
    Source

Файлы типов контента связаны с исполняемым файлом (сборкой) только по относительному пути, в котором они хранятся. Относительный URL-адрес хранится в метаданных сборки. Ожидается, что эти файлы будут найдены во время выполнения, но их можно изменять/обновлять без перекомпиляции сборки.

Значение "Копировать, если новее" означает, что компилятор позаботится о копировании исходного файла в нужное место в процессе сборки сборки, чтобы сохранить относительный путь, например, если файл находится в подпапке Images проекта, например, MyProject/Images, тогда копия будет создана в MyProject/bin/Debug/Images, когда приложение скомпилировано в режиме отладки. Сборка, встроенная в MyProject/bin/Debug, относительный путь такой же.

2. Как указать URL-адрес файла содержимого в разметке.

Это самая простая часть, и, как правило, единственная объясненная. Но это работает, только если предыдущий шаг был сделан правильно.

Чтобы использовать файл содержимого, просто используйте ярлык разметки относительного пути (относительно сборки): <Image Source="Images/Lighthouse.jpg"/> (нет начального /).


В других случаях, когда файл не объявлен как тип содержимого (например, изображение, которое должно быть встроено в сборку как ресурс, или файл, который должен быть загружен из сети), связаны с вариациями синтаксиса, когда простой URL-адрес заменяется на упаковать URI.

Обратите внимание, что решение URI пакета часто предлагается для ссылки на файлы, объявленные как Content, поскольку URI может ссылаться на все. Однако сокращение URL больше подходит для автономных файлов, расположение которых относительно сборки известно во время разработки.

Для более детального просмотра смотрите:

Ресурсы, содержимое и файлы приложений WPF