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:
Beneficios:
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.
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;