Recursos de imagen WPF


Vengo de un fondo mayormente web y un poco Windows Forms. Para un nuevo proyecto, usaremos WPF. La aplicación WPF necesitará 10-20 pequeños iconos e imágenes para fines ilustrativos. Estoy pensando en almacenarlos en la asamblea como recursos incrustados. ¿Es ese el camino correcto?

¿Cómo puedo especificar en XAML que un control de imagen debe cargar la imagen desde un recurso incrustado?

Author: Peter Mortensen, 2008-12-07

10 answers

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 compartirlos entre todos los elementos 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 establecer el archivo Image.png para tener una acción de compilación de Resource en lugar de solo Content. Esto hace que la imagen se lleve dentro del ensamblado compilado.

 435
Author: Drew Noakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-16 11:12:37

Encontré que es la mejor práctica de usar imágenes, videos, etc. is:

  • Cambiar sus archivos "Build action" a "Contenido". Asegúrese de comprobar Copiar al directorio de compilación.
    • Se encuentra en el menú "Clic derecho" en la ventana del Explorador de soluciones.
  • Fuente de imagen en la siguiente formato:
    • "/"YourAssemblyName" ; component/"YourPath"/"YourImage.png""

Ejemplo

<Image Source="/WPFApplication;component/Images/Start.png" />

Beneficios:

  • Los archivos no están incrustados en el ensamblado.
    • 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 ensamblajes.
 155
Author: Nuno Rodrigues,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-19 11:50:54

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 así comparto el mío aquí que funciona con imágenes. (el mío era un .gif)

Resumen:

Devuelve un BitmapFrame que parece gustar a los "destinos" de ImageSource.

Uso:

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:

De mis experiencias la cadena de paquetes no es el problema, compruebe su flujos y especialmente si la lectura de la primera vez ha establecido el puntero al final del archivo y necesita volver a configurarlo a cero antes de leer de nuevo.

¡Espero que esto te ahorre las muchas horas que desearía que esta pieza tuviera para mí!

 43
Author: Craig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-13 19:13:10

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:

/// <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 ResourceHelper):

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

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

 37
Author: Eric Ouellet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-19 12:13:45

Sí, es el camino correcto.

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

<Image Source="..\Media\Image.png" />

Debe establecer la acción de compilación del archivo de imagen en "Resource".

 36
Author: ema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-19 10:54:00

Descripción completa cómo utilizar 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 las asambleas referenciadas/referenciadas.

 13
Author: techfan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-19 12:11:46
  1. Visual Studio 2010 Professional SP1.
  2. . NET Framework 4 Perfil de cliente.
  3. Imagen PNG añadida como recurso en las propiedades del proyecto.
  4. Nuevo archivo en la carpeta de recursos creado automáticamente.
  5. Acción de compilación establecida en resource.

Esto funcionó para mí:

<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
 4
Author: JoanComasFdz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-23 09:16:51

Si está utilizando Blend, para hacerlo más fácil y no tener ningún problema para obtener la ruta correcta para el atributo Source, simplemente arrastre y suelte la imagen desde el panel del proyecto en el diseñador.

 3
Author: user42467,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-19 11:48:59

Sí, es el camino correcto. Puede usar imágenes en el archivo Fuente 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>
 3
Author: Sanjay Ranavaya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-19 12:15:03

Lo siguiente funcionó y las imágenes a establecer 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;
 -3
Author: Raghulan Gowthaman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-19 12:14:36