225 votos

Configuración de WPF fuente de la imagen en el código

Estoy tratando de establecer un WPF original de la imagen en el código. La imagen está incrustado como un recurso en el proyecto. Mirando los ejemplos que me he encontrado con el siguiente código. Por alguna razón no funciona - la imagen no se muestra.

Por la depuración puedo ver que la secuencia contiene los datos de la imagen. Entonces, ¿qué tiene de malo?

Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
PngBitmapDecoder iconDecoder = new PngBitmapDecoder(iconStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
ImageSource iconSource = iconDecoder.Frames[0];
_icon.Source = iconSource;

El icono se define algo como esto: <Image x:Name="_icon" Width="16" Height="16" />

284voto

Jared Harley Puntos 4729

Después de tener el mismo problema que usted y hacer un poco de lectura, descubrí la solución - Pack URIs.

Hice el siguiente código:

Image finalImage = new Image();
finalImage.Width = 80;
...
BitmapImage logo = new BitmapImage();
logo.BeginInit();
logo.UriSource = new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png");
logo.EndInit();
...
finalImage.Source = logo;

El URI se divide en partes:

  • Autoridad: application:///
  • Ruta de acceso: El nombre de un archivo de recursos que se compila en una referencia de ensamblado. La ruta de acceso debe ajustarse al siguiente formato: AssemblyShortName[;Version][;PublicKey];component/Path

    • AssemblyShortName: el nombre corto para la referencia de ensamblado.
    • ;Versión [opcional]: la versión de la referencia de ensamblado que contiene el archivo de recursos. Este se utiliza cuando dos o más ensamblados con el mismo nombre corto de la carga.
    • ;Clavepublica [opcional]: la clave pública que se utiliza para firmar la referencia de ensamblado. Este se utiliza cuando dos o más ensamblados con el mismo nombre corto de la carga.
    • ;componente: especifica que la asamblea se refiere a que se hace referencia desde la asamblea local.
    • /Ruta de acceso: el nombre del archivo de recursos, incluyendo su ruta relativa a la raíz de la referencia de ensamblado de la carpeta del proyecto.

Las tres barras diagonales tras application: tienen que ser reemplazados con comas:

Nota: La autoridad de los componentes de un paquete de URI es un integrado URI que apunta a un paquete y deben cumplir con la RFC 2396. Además, el carácter "/" debe ser reemplazado con el "," carácter", y caracteres reservados como "%" y "?" debe ser escapado. Ver el OPC para obtener más detalles.

Y, por supuesto, asegúrese de que configurar la acción de compilación en la imagen para Resource.

142voto

Simon Puntos 11945
var uriSource = new Uri(@"/WpfApplication1;component/Images/Untitled.png", UriKind.Relative);
foo.Source = new BitmapImage(uriSource);

Para cargar una imagen llamada "Untitled.png" en una carpeta llamada "Imágenes" con su "Build Action" conjunto de "Recursos" en una asamblea denominada "WpfApplication1".

55voto

Alex B Puntos 973

Esto es un poco menos código y se puede hacer en una sola línea.

string packUri = "pack://application:,,,/AssemblyName;component/Images/icon.png";
_image.Source = new ImageSourceConverter().ConvertFromString(packUri) as ImageSource;

20voto

A Bothe Puntos 141

Muy fácil:

Para establecer un elemento de menú de la imagen de forma dinámica, sólo hacer lo siguiente:

MyMenuItem.ImageSource = new BitmapImage(new Uri("Resource/icon.ico",UriKind.Relative));

...mientras que el "icon.ico" puede ser localizado en todas partes (en la actualidad se encuentra en la sección 'Recursos' en el directorio) y debe ser enlazado como un Recurso...eso es todo :-D

11voto

Andrew Myhre Puntos 851

¿Has probado:

Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = iconStream;
bitmap.EndInit();
_icon.Source = bitmap;

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X