How do I use an icon that is a resource in WPF?

前端 未结 5 484
北荒
北荒 2020-11-29 20:06

I have a .ico file that is embedded as a resource (build action set to resource). I am trying to create a NotifyIcon. How can I reference my icon?

notifyIc         


        
相关标签:
5条回答
  • 2020-11-29 20:42

    I created a project here and used an embedded resource (build action was set to Embedded Resource, rather than just resource). This solution doesn't work with Resource, but you may be able to manipulate it. I put this on the OnIntialized() but it doesn't have to go there.

    //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;
        }
    
    0 讨论(0)
  • 2020-11-29 20:54

    If you are just looking for the simple answer, I think this is it where MyApp is your application name and where that's the root namespace name for your application. You have to use the pack URI syntax, but it doesn't have to be that complicated to pull an icon out of your embedded resources.

        <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">
    
    0 讨论(0)
  • 2020-11-29 20:59

    Your icon file should be added to one of your project assemblies and its Build Action should be set to Resource. After adding a reference to the assembly, you can create a NotifyIcon like this:

    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 );
    
    0 讨论(0)
  • 2020-11-29 21:01

    Well, you don't want to use the resx style resources: you just stick the ico file in your project in a folder (lets say "ArtWork") and in the properties, set the Build Action to "Resources" ...

    Then you can reference it in XAML using PACK URIs ... "pack://application:,,,/Artwork/Notify.ico"

    See here: http://msdn.microsoft.com/en-us/library/aa970069.aspx and the sample

    If you want to be a little bit more ... WPF-like, you should look into the WPF Contrib project on CodePlex which has a NotifyIcon control which you can create in XAML and which uses standard WPF menus (so you can stick "anything" in the menu).

    0 讨论(0)
  • 2020-11-29 21:03

    A common usage pattern is to have the notify icon the same as the main window's icon. The icon is defined as a PNG file.

    To do this, add the image to the project's resources and then use as follows:

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

    In the window 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">
    
    0 讨论(0)
提交回复
热议问题