Как я могу получить BitmapImage из ресурса? - PullRequest
34 голосов
/ 13 мая 2009

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

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

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

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

Когда я пытаюсь создать ' pack 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 не распознан».


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

1 Ответ

20 голосов
/ 13 мая 2009

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

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

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

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

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

...