it-swarm-es.tech

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

Tengo un archivo .ico que está incrustado como un 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
61
ScottG

Su archivo de ícono debe agregarse a uno de los ensamblados de su proyecto y su Acción de creació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 );
96
user13125

Un patrón de uso común es tener el icono de notificación igual 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">
20
Thomas Bratt

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

Luego puede hacer referencia en XAML utilizando PACK URIs ... "pack: // application: ,/Artwork/Notify.ico"

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

Si desea ser un poco más ... similar a WPF, debe buscar en WPF Contrib project en CodePlex que tiene un control NotifyIcon que puede crear en XAML y que usa menús estándar de WPF (por lo que Puede pegar "cualquier cosa" en el menú).

12
Jaykul

Si solo está buscando la 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. Debe usar la sintaxis de URI del paquete, pero no tiene que ser tan complicado para extraer un icono 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">
2
Mike Sage

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