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

Resuelto Torbjørn asked hace 15 años • 19 respuestas

Estoy intentando configurar la fuente de una imagen WPF en el código. La imagen está incrustada como recurso en el proyecto. Al observar ejemplos, se me ocurrió el siguiente código. Por alguna razón no funciona: la imagen no aparece.

Al depurar puedo ver que la transmisión contiene los datos de la imagen. ¿Así que qué hay 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 así:<Image x:Name="_icon" Width="16" Height="16" />

Torbjørn avatar Dec 08 '08 23:12 Torbjørn
Aceptado

Después de tener el mismo problema que usted y leer un poco, descubrí la solución: Empaquetar URI .

Hice lo siguiente en 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;

O más corto, usando otro constructor BitmapImage:

finalImage.Source = new BitmapImage(
    new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png"));

El URI se divide en partes:

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

    • AssemblyShortName: el nombre corto del ensamblado al que se hace referencia.
    • ;Versión [opcional]: la versión del ensamblado al que se hace referencia que contiene el archivo de recursos. Esto se utiliza cuando se cargan dos o más ensamblados a los que se hace referencia con el mismo nombre corto.
    • ;PublicKey [opcional]: la clave pública que se utilizó para firmar el ensamblado al que se hace referencia. Esto se utiliza cuando se cargan dos o más ensamblados a los que se hace referencia con el mismo nombre corto.
    • ;componente: especifica que el ensamblado al que se hace referencia proviene del ensamblado local.
    • /Ruta: el nombre del archivo de recursos, incluida su ruta, en relación con la raíz de la carpeta del proyecto del ensamblado al que se hace referencia.

Las tres barras que siguen application:deben sustituirse por comas:

Nota: El componente de autoridad de un URI de paquete es un URI incorporado que apunta a un paquete y debe cumplir con RFC 2396. Además, el carácter "/" debe reemplazarse con el carácter "," y caracteres reservados como "%". y "?" hay que escapar. Consulte la OPC para obtener más detalles.

Y, por supuesto, asegúrese de configurar la acción de creación de su imagen en Resource.

Jared Harley avatar Oct 30 '2009 18:10 Jared Harley
var uriSource = new Uri(@"/WpfApplication1;component/Images/Untitled.png", UriKind.Relative);
foo.Source = new BitmapImage(uriSource);

Esto cargará una imagen llamada "Untitled.png" en una carpeta llamada "Imágenes" con su "Acción de compilación" configurada en "Recurso" en un ensamblado llamado "WpfApplication1".

Simon avatar Aug 26 '2009 04:08 Simon

Esto es un poco menos de 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;
Alex B avatar Jan 06 '2010 17:01 Alex B

Muy fácil:

Para configurar dinámicamente la imagen de un elemento de menú, solo haga lo siguiente:

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

...mientras que "icon.ico" puede ubicarse en todas partes (actualmente está ubicado en el directorio 'Recursos') y debe vincularse como Recurso...

A Bothe avatar Dec 12 '2010 17:12 A Bothe