c# - Recursos de imagen WPF
.net embedded-resource (10)
- Visual Studio 2010 Professional SP1.
- .NET Framework 4 Perfil de cliente.
- Imagen PNG agregada como recurso en las propiedades del proyecto.
- Nuevo archivo en la carpeta de recursos creado automáticamente.
- Construye la acción establecida en el recurso.
Esto funcionó para mí:
<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
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 iconos e imágenes pequeños con fines ilustrativos. Estoy pensando en almacenar estos en el ensamblaje como recursos incrustados. ¿Es ese el camino correcto?
¿Cómo especifico en XAML que un control de imagen debe cargar la imagen desde un recurso incrustado?
Algunas personas están preguntando acerca de hacer esto en 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 y comparto el mío aquí, que funciona con imágenes. (el mio 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);
}
Aprendizaje:
Desde mi experiencia, la cadena de paquetes no es el problema, revise sus transmisiones y, especialmente, si al leerlas la primera vez ha puesto el puntero al final del archivo y necesita restablecerlo a cero antes de volver a leer.
¡Espero que esto te ahorre las muchas horas que deseo que esta pieza haya tenido para mí!
Descripción completa de cómo usar los recursos: Archivos de recursos, contenido y datos de la aplicación WPF
Y cómo hacer referencia a ellos, lea "Empaquetar URI en WPF".
En resumen, incluso hay medios para hacer referencia a los recursos de los ensamblados referenciados / referenciados.
En el código para cargar un recurso en el ensamblaje en ejecución, donde mi imagen Freq.png
estaba en la carpeta Icons
y se definió 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:
/// <summary>
/// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as ''Resource'' not as ''Embedded resource''.
/// </summary>
/// <param name="pathInApplication">Path without starting slash</param>
/// <param name="assembly">Usually ''Assembly.GetExecutingAssembly()''. If not mentionned, I will use the calling assembly</param>
/// <returns></returns>
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 pones la función en una clase de ResourceHelper):
this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");
Nota : vea los URI del paquete MSDN en WPF :
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml
Lo siguiente funcionó y las imágenes a configurar 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;
Me pareció que la mejor práctica de usar imágenes, videos, etc. es:
- Cambia tus archivos "Acción de compilación" a "Contenido" . Asegúrese de marcar Copiar para construir el directorio .
- Se encuentra en el menú "Clic derecho" en la ventana del Explorador de soluciones.
- Fuente de imagen en el siguiente formato:
- "/ « YourAssemblyName » ; component /« YourPath »/ « YourImage.png » "
Ejemplo
<Image Source="/WPFApplication;component/Images/Start.png" />
Beneficios:
- Los archivos no están incrustados en el ensamblaje.
- El Administrador de recursos planteará algunos problemas de desbordamiento de memoria con demasiados recursos (en el momento de la compilación).
- Se puede llamar entre asambleas.
Sí, es el camino correcto. Puedes usar imágenes en el archivo de recursos usando una ruta:
<StackPanel Orientation="Horizontal">
<CheckBox Content="{Binding Nname}" IsChecked="{Binding IsChecked}"/>
<Image Source="E:/SWorking/SharePointSecurityApps/SharePointSecurityApps/SharePointSecurityApps.WPF/Images/sitepermission.png"/>
<TextBlock Text="{Binding Path=Title}"></TextBlock>
</StackPanel>
Sí, es el camino correcto.
Podría usar la imagen en el archivo de recursos solo usando la ruta:
<Image Source="../Media/Image.png" />
Debe configurar la acción de compilación del archivo de imagen en "Recurso".
Si está utilizando Blend , para que sea más fácil y no tenga ningún problema para obtener la ruta correcta para el atributo Fuente , simplemente arrastre y suelte la imagen desde el panel Proyecto al diseñador.
Si va a utilizar 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, cree un BitmapSource
como un recurso en algún lugar:
<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />
Luego, en tu código, usa algo como:
<Image Source="{StaticResource MyImageSource}" />
En mi caso, encontré que tenía que configurar el archivo Image.png
para tener una acción de compilación de Resource
lugar de solo Content
. Esto hace que la imagen se lleve dentro de su ensamblaje compilado.