Как я могу получить BitmapImage из ресурса?

Моя сборка включает изображение с помощью BuildAction == Resource. Я хочу получить BitmapImage из этого встроенного ресурса.

Я могу загрузить BitmapImage из файла следующим образом:

var bitmap = new BitmapImage(new Uri(path));

Но как я могу создать Uri, который будет ссылаться на изображение встроенного ресурса?

Когда я пытаюсь создать 'URI пакета (например, pack://application:,,,/MyImage.png или pack://application:,,,/MyAssembly;component/MyImage.png), генерируется исключение:

System.UriFormatException "Недопустимый URI: ожидался порт из-за наличия двоеточия (": "), но порт не мог быть проанализирован".

Я нашел исправление в UriFormatException в этом сообщении

Однако при применении этого исправления я все еще получаю исключения, пытающиеся загрузить BitmapImage из URI пакета.

При использовании формата pack://application:,,,/Image.png я получаю исключение NullReferenceException, а при использовании формата pack://application:,,,/AssemblyName;component/Image.png я получаю исключение NotSupportedException. Префикс Uri не распознается.


Резюме Моя проблема заключалась в том, что я пытался использовать "пакетный URI" в процессе до того, как был создан какой-либо элемент управления WPF/window/etc, поэтому схема URI "pack" еще не была зарегистрирована (другим требованиям WPF "материал" также не нужно быть установленным, потому что вручную регистрация схемы пакета сама по себе не устраняет проблему). Решение заключалось в том, чтобы дождаться, пока не создадим экземпляр моего пользовательского элемента управления WPF для использования URI пакета.

Ответ 1

Эта страница MSDN содержит всю информацию, которую вы, возможно, захотите узнать о URI ресурса в WPF (часто называемые URI пакетов). Вы захотите чаще использовать относительные URI, поэтому см. Таблица 4, которая должна быть особенно полезной.

Если вам нужен краткий обзор URI ресурсов (пакетов), см. этот пост в блоге. Он показывает, что синтаксис действительно относительно прост:

pack://application:,,,/ResourceFile.xaml

pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml

Однако есть несколько причуд для разработки (по моему опыту), поэтому часто для поиска правильного URI ресурса требуется немного экспериментов.