wpf resources bitmapimage pack-uri

wpf - ¿Cómo puedo obtener una imagen de mapa de bits de un recurso?



resources bitmapimage (1)

Esta página de MSDN contiene toda la información que quizás desee saber sobre los URI de recursos en WPF (a menudo denominados URI de paquete). Es probable que desee utilizar URI relativos con más frecuencia, por lo que consulte la Tabla 4 , que debería ser de particular uso.

Si desea una visión general más breve de los URI de recursos (paquete), consulte esta publicación en el blog . Muestra que la sintaxis es de hecho relativamente simple:

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

Sin embargo, hay algunos caprichos para resolver (en mi experiencia), por lo que a menudo encontrar el URI de recursos correcto requiere un poco de experimentación.

Mi ensamblaje incluye una imagen con BuildAction == Resource. Quiero obtener una BitmapImage desde este recurso incrustado.

Puedo cargar una BitmapImage desde un archivo como este:

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

Pero, ¿cómo puedo crear un URI que se refiera a una imagen de recurso incrustada?

Cuando intento crear un '' URI de paquete '' (por ejemplo pack://application:,,,/MyImage.png o pack://application:,,,/MyAssembly;component/MyImage.png ), se lanza una excepción :

System.UriFormatException "URI no válido: se esperaba un puerto debido a que hay dos puntos ('':'') presentes, pero el puerto no se pudo analizar".

Encontré la solución para UriFormatException en esta publicación de blog

Sin embargo, con esa corrección aplicada, sigo recibiendo excepciones al tratar de cargar un BitmapImage desde un URI de paquete.

Cuando uso el formato pack://application:,,,/Image.png , obtengo una NullReferenceException, y cuando uso el formato pack://application:,,,/AssemblyName;component/Image.png , obtengo una excepción NotSupportedException "El prefijo Uri no es reconocido".

Resumen Mi problema era que estaba tratando de usar un ''URI de paquete'' en un proceso antes de que se hubiera instanciado cualquier control / ventana / etc de WPF, por lo que el esquema de URI ''paquete'' aún no se había registrado (otras ''cosas'' requeridas por WPF también deben no se debe establecer también, porque registrar manualmente el esquema del paquete no soluciona el problema por sí mismo). La solución fue esperar hasta después de instanciar mi usercontrol de WPF para usar los URI del paquete.