2008-09-16 23 views
57

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

notifyIcon = new NotifyIcon(); 
notifyIcon.Icon = ??  // my icon file is called MyIcon.ico and is embedded 
+0

ver pregunta similar aquí: [ENTER Descripción enlace aquí] [1] [1]: http://stackoverflow.com/questions/1127647/convert-system-drawing- icon-to-system-media-imagesource – PatTheFrog

Respuesta

88

Su archivo de icono debe agregarse a uno de los ensamblados de su proyecto y su acción de compilación debe establecerse en Recurso. Después de añadir una referencia a la asamblea, se puede crear un NotifyIcon así:

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); 
+11

No olvide desechar iconStream una vez que se haya creado el icono. – devios1

+0

Gracias a este ejemplo finalmente conseguí cómo obtener un recurso en un ensamblado al que se hace referencia en mi aplicación: new Uri ("paquete: // aplicación: ,,,/SuAsambleaReferenciada; componente/YourPossibleSubFolder/YourResourceFile.ico") –

+0

¿Esto permitir que el icono tenga múltiples resoluciones? – tofutim

9

Bueno, que no quieren utilizar los recursos de estilo resx: sólo se adhieren el archivo ico en su proyecto en una carpeta (digamos "ArtWork") y en las propiedades, establezca la Acción de compilación en "Recursos" ...

Luego puede hacer referencia en XAML usando PACK URI ... "paquete: // aplicación: ,,,/ilustraciones/Notify.ico"

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

Si quieres ser un poco más ... WPF, debes mirar el proyecto WPF Contrib en CodePlex que tiene un control NotifyIcon que puedes crear en XAML y que usa menús WPF estándar (para que puedas pegar "cualquier cosa") "en el menú).

1

Creé un proyecto aquí y usé un recurso incrustado (la acción de compilación se configuró en Recurso incrustado, en lugar de solo recurso). Esta solución no funciona con Resource, pero es posible que pueda manipularla. 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

Solo un FYI - Leí en mi kit de entrenamiento MS WPF MCTS que no use Embedded Resources porque usa un esquema de administración de recursos diferente que es menos accesible desde WPF. No estoy seguro de lo que eso significa, pero solo está pasando – ScottG

+0

@ScottG El uso de URI puede no funcionar si desea cargar recursos antes de que se cree la ventana principal.Por lo tanto, debe incrustar el icono y cargarlo como lo describe blackSphere. En mi caso, tengo que cargar el icono en mi ApplicationContext para mi aplicación de bandeja. –

19

Un patrón de uso común consiste en hacer que el icono de notificación sea el mismo que el ícono de la ventana principal. El icono se define como un archivo PNG.

Para ello, agregue la imagen a los recursos del proyecto y luego utilice la siguiente manera:

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

En el XAML ventana:

<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"> 
+2

Tenga en cuenta que debe agregar el icono utilizando el diseñador de recursos y luego establecer la acción de compilación en el recurso para que esto funcione. –

0

Si estás en busca de la respuesta simple, Creo que aquí es donde MyApp es su nombre de aplicación y dónde está el nombre del espacio de nombres raíz para su aplicación. Debe usar la sintaxis de URI del paquete, pero no tiene por qué ser tan complicado sacar un ícono de sus 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"> 
Cuestiones relacionadas