Recursos de imagen de WPF

Vengo de un fondo en su mayoría web y un poco de Windows Forms. Para un nuevo proyecto, usaremos WPF. La aplicación WPF necesitará de 10 a 20 icons pequeños e imágenes con fines ilustrativos. Estoy pensando en almacenarlos en el ensamblado como recursos integrados. ¿Es ese el camino correcto?

¿Cómo especifico en XAML que un control de imagen debería cargar la imagen desde un recurso incrustado?

Si va a usar la imagen en varios lugares, entonces vale la pena cargar los datos de la imagen solo una vez en la memoria y luego compartirla entre todos los elementos de la Image .

Para hacer esto, crea un BitmapSource como recurso en alguna parte:

  

Luego, en tu código, usa algo como:

  

En mi caso, descubrí que tenía que establecer el archivo Image.png para tener una acción de comstackción de Resource lugar de simplemente Content . Esto hace que la imagen sea transportada dentro de su ensamblado comstackdo.

La mejor práctica de usar imágenes, videos, etc. es:

  • Cambie sus archivos “Crear acción” a “Contenido” . Asegúrese de marcar Copiar al directorio de comstackción .
    • Se encuentra en el menú “Right-Click” en la ventana Solution Explorer.
  • Fuente de la imagen en el siguiente formato:
    • “/ « YourAssemblyName » ; componente /« YourPath »/ « YourImage.png »

Ejemplo

  

Beneficios:

  • Los archivos no están incrustados en el ensamblaje.
    • Resource Manager planteará algunos problemas de desbordamiento de memoria con demasiados recursos (en tiempo de comstackción).
  • Se puede llamar entre assemblys.

Algunas personas preguntan sobre hacer esto en el código y no obtener una respuesta.

Después de pasar muchas horas buscando, encontré un método muy simple, no encontré ningún ejemplo, así que comparto el mío que funciona con imágenes. (el mío era un .gif)

Resumen:

Devuelve un BitmapFrame que a los “destinos” de ImageSource parece gustarles.

Utilizar:

 doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]"); 

Método:

 static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName) { Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute); return BitmapFrame.Create(oUri); } 

Aprendizajes:

Según mis experiencias, la secuencia de paquetes no es el problema, verifica tus transmisiones y especialmente si al leerla la primera vez ha establecido el puntero al final del archivo y debes restablecerlo a cero antes de volver a leerlo.

¡Espero que esto te ahorre las muchas horas que deseo que esta pieza tenga para mí!

En código para cargar un recurso en el ensamblado de ejecución donde mi imagen Freq.png estaba en la carpeta Icons y definida como Resource :

 this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/" + Assembly.GetExecutingAssembly().GetName().Name + ";component/" + "Icons/Freq.png", UriKind.Absolute)); 

También hice una función:

 ///  /// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'. ///  /// Path without starting slash /// Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly ///  public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null) { if (assembly == null) { assembly = Assembly.GetCallingAssembly(); } if (pathInApplication[0] == '/') { pathInApplication = pathInApplication.Substring(1); } return new BitmapImage(new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathInApplication, UriKind.Absolute)); } 

Uso (suponiendo que coloque la función en una clase ResourceHelper):

 this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png"); 

Nota : consulte URI de paquete de MSDN en WPF :
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

Sí, es el camino correcto.

Puede usar la imagen en el archivo de recursos simplemente usando la ruta:

  

Debe establecer la acción de comstackción del archivo de imagen en “Recurso”.

Descripción completa de cómo usar los recursos: recursos de la aplicación WPF, contenido y archivos de datos

Y cómo hacer referencia a ellos, lea “Pack URIs in WPF”.

En resumen, incluso hay medios para referenciar recursos de ensambles referenciados / referenciados.

  1. Visual Studio 2010 Professional SP1.
  2. .NET Framework 4 Client Profile.
  3. Imagen PNG agregada como recurso en las propiedades del proyecto.
  4. Nuevo archivo en la carpeta de Recursos creado automáticamente.
  5. Crear acción establecida en recurso.

Esto funcionó para mí:

  

Sí, es la manera correcta. Puede usar imágenes en el archivo de recursos usando una ruta:

      

Si está utilizando Blend , para que sea más fácil y no tenga problemas para obtener la ruta correcta para el atributo Fuente , simplemente arrastre y suelte la imagen desde el panel Proyecto al diseñador.

Lo siguiente funcionó y las imágenes que se establecerán son recursos en propiedades:

  var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); MyButton.Background = new ImageBrush(bitmapSource); img_username.Source = bitmapSource;