Come si usa un’icona che è una risorsa in WPF?

Ho un file .ico che è incorporato come una risorsa (build action set to resource). 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 

Il tuo file di icona dovrebbe essere aggiunto a uno dei tuoi gruppi di progetto e la sua azione di compilazione dovrebbe essere impostata su Risorsa. Dopo aver aggiunto un riferimento all’assembly, puoi creare un NotifyIcon come questo:

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

Un modello di utilizzo comune prevede che l’icona di notifica sia 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:

  

Bene, non vuoi usare le risorse in stile resx: devi solo inserire il file ico nel tuo progetto in una cartella (diciamo “ArtWork”) e nelle proprietà, impostare l’azione Build su “Risorse” …

Quindi puoi fare riferimento in XAML usando gli URI PACK … “pacchetto: // application: ,,, / Artwork / Notify.ico”

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

Se vuoi essere un po ‘più … WPF-like, dovresti esaminare il progetto Contrib di WPF su CodePlex che ha un controllo NotifyIcon che puoi creare in XAML e che usa i menu standard WPF (così puoi attaccare “qualsiasi cosa “nel menu).

Ho creato un progetto qui e ho utilizzato una risorsa incorporata (l’azione di compilazione è stata impostata su Risorsa incorporata, anziché solo risorsa). Questa soluzione non funziona con Resource, ma potresti essere in grado di manipolarlo. Lo metto 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; } 

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