2009-05-13 5 views
34

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

я могу загрузить BitmapImage из файла, как это:

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

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

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

System.UriFormatException «Invalid URI: Ожидалось порт из-за есть двоеточие (':'), но порт не может быть разобран. "

Я нашел затруднительное, к UriFormatException в этом blog post

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

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


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

+1

Спасибо за ваше резюме проблемы. У меня такая же проблема, и я попытаюсь обходить ее, как вы предлагаете. – Oskar

+0

Возможный дубликат [Загрузка BitmapImage в коде] (http://stackoverflow.com/questions/801833/loading-bitmapimage-in-code) –

ответ

20

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

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

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

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

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

+1

@mackenir: Вы когда-нибудь считали, что URL-адрес, опубликованный в * отредактированном * вопросе еще не появился в то время, когда я написал свой ответ. Грубость не даст вам хорошего ответа. – Noldorin

+1

Извините! Я забыл, что редактировал вопрос, верю или нет. – mackenir

+1

@mackenir: В этом случае не стоит беспокоиться. Вы пробовали просто использовать относительный URI, как показано в таблице 4 на странице MSDN? Возможно, вам повезло с этим ... – Noldorin