it-swarm-eu.dev

Come posso usare un'icona che è una risorsa in WPF?

Ho un file .ico che è incorporato come risorsa (crea azione impostata su risorsa). Sto cercando di creare un NotifyIcon. Come posso fare riferimento alla mia icona?

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

Il tuo file icona deve essere aggiunto a uno dei tuoi assiemi di progetto e la sua azione di costruzione deve essere impostata su Risorsa. Dopo aver aggiunto un riferimento all'Assemblea, è possibile creare un NotifyIcon in questo modo:

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 );
100
user13125

Un modello di utilizzo comune è avere l'icona di notifica uguale all'icona della finestra principale. L'icona è definita come un file PNG.

Per fare ciò, aggiungi l'immagine alle risorse del progetto e poi usa come segue:

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

Nella finestra 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

Bene, non vuoi usare le risorse di stile resx: basta incollare il file ico nel tuo progetto in una cartella (diciamo "ArtWork") e nelle proprietà, impostare l'azione di costruzione su "Risorse" ...

Quindi puoi fare riferimento in XAML usando gli URI PACK ... "pack: // application: ,/Artwork/Notify.ico"

Vedi qui: http://msdn.Microsoft.com/en-us/library/aa970069.aspx e esempio

Se vuoi essere un po 'più simile a WPF, dovresti esaminare il progetto WPF Contrib su CodePlex che ha un controllo NotifyIcon che puoi creare in XAML e che utilizza i menu WPF standard (in modo da poter inserire "qualsiasi cosa" nel menu).

12
Jaykul

Se stai solo cercando la risposta semplice, penso che sia qui che MyApp è il nome dell'applicazione e dove si trova il nome dello spazio dei nomi radice per l'applicazione. Devi usare la sintassi dell'URI del pacchetto, ma non deve essere così complicato estrarre un'icona dalle tue risorse incorporate.

    <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

Ho creato un progetto qui e utilizzato una risorsa incorporata (l'azione di compilazione è stata impostata su Risorsa incorporata, anziché solo su risorsa). Questa soluzione non funziona con Resource, ma potresti essere in grado di manipolarla. L'ho messo su OnIntialized () ma non deve andare lì.

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