Pregunta

Tengo un archivo .ico que está incrustado como recurso (acción de compilación configurada como recurso).Estoy intentando 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
¿Fue útil?

Solución

Su archivo de icono debe agregarse a uno de los ensamblajes de su proyecto y su Acción de compilación debe establecerse en Recurso.Después de agregar una referencia al ensamblaje, 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 );

Otros consejos

Un patrón de uso común es que el ícono de notificación sea el mismo que el ícono 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 la siguiente manera:

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

Bueno, no querrás utilizar los recursos de estilo resx:simplemente pega el archivo ico en tu proyecto en una carpeta (digamos "ArtWork") y en las propiedades, configura la Acción de compilación en "Recursos"...

Luego puedes hacer referencia a él en XAML usando PACK URI..."paquete://aplicación:,,,/Artwork/Notify.ico"

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

Si quieres ser un poquito más...Al igual que WPF, deberías mirar el Contribuir proyecto en CodePlex que tiene un control NotifyIcon que puede crear en XAML y que utiliza menús estándar de WPF (para que pueda colocar "cualquier cosa" en el menú).

Si solo está buscando una respuesta simple, creo que aquí es donde MyApp es el nombre de su aplicación y donde está el nombre del espacio de nombres raíz de su aplicación.Tienes que usar la sintaxis del URI del paquete, pero no tiene por qué ser tan complicado extraer un ícono de tus recursos integrados.

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

Creé un proyecto aquí y utilicé un recurso integrado (la acción de compilación se configuró en Recurso integrado, en lugar de solo recurso).Esta solución no funciona con Resource, pero es posible que puedas 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;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top