web-dev-qa-db-fra.com

Comment utiliser une icône qui est une ressource dans WPF?

J'ai un fichier .ico qui est incorporé en tant que ressource (action de génération définie sur ressource). J'essaie de créer un NotifyIcon. Comment puis-je référencer mon icône?

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

Votre fichier d'icônes doit être ajouté à l'un de vos assemblys de projet et son action de génération doit être définie sur Ressource. Après avoir ajouté une référence à l'assembly, vous pouvez créer un NotifyIcon comme celui-ci:

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 modèle d'utilisation courant consiste à avoir l'icône de notification identique à celle de la fenêtre principale. L'icône est définie comme un fichier PNG.

Pour ce faire, ajoutez l'image aux ressources du projet, puis utilisez comme suit:

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

Dans la fenêtre 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

Eh bien, vous ne voulez pas utiliser les ressources de style resx: vous collez simplement le fichier ico dans votre projet dans un dossier (disons "ArtWork") et dans les propriétés, définissez l'action Build sur "Resources" ...

Ensuite, vous pouvez le référencer en XAML en utilisant les URI PACK ... "pack: // application: ,/Artwork/Notify.ico"

Voir ici: http://msdn.Microsoft.com/en-us/library/aa970069.aspx et le exemple

Si vous voulez être un peu plus ... comme WPF, vous devriez regarder le projet WPF Contrib sur CodePlex qui a un contrôle NotifyIcon que vous pouvez créer en XAML et qui utilise les menus WPF standard (vous pouvez donc coller "n'importe quoi" dans le menu).

12
Jaykul

Si vous cherchez juste la réponse simple, je pense que c'est là où MyApp est le nom de votre application et où c'est le nom de l'espace de noms racine pour votre application. Vous devez utiliser la syntaxe URI du pack, mais cela ne doit pas être si compliqué de retirer une icône de vos ressources intégrées.

    <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

J'ai créé un projet ici et utilisé une ressource intégrée (l'action de génération a été définie sur Ressource intégrée, plutôt que sur une ressource uniquement). Cette solution ne fonctionne pas avec Resource, mais vous pourrez peut-être la manipuler. J'ai mis cela sur le OnIntialized () mais il n'a pas à y aller.

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