¿Cómo uso un icono que es un recurso en WPF?


Tengo un .archivo ico que está incrustado como recurso (acción de compilación establecida en recurso). Estoy tratando de crear un NotifyIcon. ¿Cómo puedo hacer referencia a mi icono?

notifyIcon = new NotifyIcon();
notifyIcon.Icon = ??     // my icon file is called MyIcon.ico and is embedded
Author: Dave Clemmer, 2008-09-16

5 answers

El archivo icon debe agregarse a uno de los ensamblados de su proyecto y su Acción de compilación debe configurarse como Recurso. Después de agregar una referencia al ensamblado, puede crear un NotifyIcon como este:

System.Windows.Forms.NotifyIcon icon = new System.Windows.Forms.NotifyIcon();
Stream iconStream = Application.GetResourceStream( new Uri( "pack://application:,,,/YourReferencedAssembly;component/YourPossibleSubFolder/YourResourceFile.ico" )).Stream;
icon.Icon = new System.Drawing.Icon( iconStream );
 93
Author: user13125,
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
2008-09-16 17:23:42

Un patrón de uso común es tener el icono notificar el mismo que el icono de la ventana principal. El icono se define como un archivo PNG.

Para hacer esto, agregue la imagen a los recursos del proyecto y luego use lo siguiente:

var iconHandle  = MyNamespace.Properties.Resources.MyImage.GetHicon();
this.notifyIcon.Icon = System.Drawing.Icon.FromHandle(iconHandle);

En la ventana XAML:

<Window x:Class="MyNamespace.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:Seahorse"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="600"
Icon="images\MyImage.png">
 19
Author: Thomas Bratt,
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
2009-12-09 00:20:41

Bueno, no quieres usar los recursos de estilo resx: simplemente pega el archivo ico en tu proyecto en una carpeta (digamos "ArtWork") y en las propiedades, establece la Acción de Compilación en "Resources" ...

Entonces puede hacer referencia a él en XAML usando URI DE PAQUETE ... "paquete: / / aplicación:,,,/Ilustraciones / Notificar.ico "

Ver aquí: http://msdn.microsoft.com/en-us/library/aa970069.aspx y la muestra

Si quieres ser un poco más ... WPF-como, usted debe mirar en el proyecto WPF Contrib en CodePlex que tiene un control NotifyIcon que puede crear en XAML y que utiliza menús WPF estándar (para que pueda pegar "cualquier cosa" en el menú).

 11
Author: Jaykul,
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
2008-09-16 17:23:38

Creé un proyecto aquí y usé un recurso incrustado (la acción de compilación se estableció como Recurso Incrustado, en lugar de solo recurso). Esta solución no funciona con Recursos, pero es posible que pueda manipularlos. Puse esto en OnIntialized () pero no tiene que ir allí.

//IconTest = namespace; exclamic.ico = resource 
System.IO.Stream stream = this.GetType().Assembly.GetManifestResourceStream("IconTest.Resources.exclamic.ico");

   if (stream != null)
   {
       //Decode the icon from the stream and set the first frame to the BitmapSource
       BitmapDecoder decoder = IconBitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.None);
       BitmapSource source = decoder.Frames[0];

       //set the source of your image
       image.Source = source;
    }
 1
Author: blackSphere,
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
2008-09-16 17:52:44

Si solo está buscando la respuesta simple, creo que aquí es donde MyApp es el nombre de su aplicación y donde ese es el nombre del espacio de nombres raíz para su aplicación. Tienes que usar la sintaxis URI del paquete, pero no tiene que ser tan complicado sacar un icono de tus recursos incrustados.

    <Window x:Class="MyApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Height="100"
    Width="200"
    Icon="pack://application:,,,/MyApp;component/Resources/small_icon.ico">
 0
Author: Mike Sage,
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
2015-08-18 19:43:31