如何使用WPF中作为资源的图标?


68

我有一个.ico文件,它作为资源嵌入(将操作设置为资源)。我正在尝试创建一个NotifyIcon。如何引用我的图标?

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

在这里看到类似的问题:在这里输入链接的描述] [1] [1]:stackoverflow.com/questions/1127647/...
PatTheFrog

Answers:


109

您的图标文件应添加到您的项目程序集之一,并且其“构建操作”应设置为“资源”。在添加对程序集的引用之后,您可以创建一个NotifyIcon,如下所示:

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

12
创建图标后,不要忘记丢弃iconStream。
devios1 2010年

多亏了这个示例,我终于有了如何在应用程序的引用程序集中获取资源的方法:new Uri(“ pack:// application:,,, / YourReferencedAssembly; component / YourPossibleSubFolder / YourResourceFile.ico”)
Andrea Antonangeli

这是否允许图标具有多种分辨率?
tofutim '16

@tofutim不。当图标文件中还有32px版本时,所有可能的方法都不会使用16px图标。Windows和图标是一个闪亮但令人伤心的故事。
ygoe

20

一种常见用法是使通知图标与主窗口的图标相同。该图标定义为PNG文件。

为此,请将图像添加到项目的资源中,然后按以下方式使用:

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

在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">

4
请注意,您应该使用资源设计器添加图标,然后将构建操作设置为“资源”以使其起作用。
Scott Munro 2010年

12

好吧,您不想使用resx样式资源:您只需将ico文件粘贴到项目中的文件夹中(让我们说“ ArtWork”),然后在属性中,将Build Action设置为“ Resources”即可。

然后,您可以使用PACK URI在XAML中引用它...“ pack:// application:,,, / Artwork / Notify.ico”

参见此处:http : //msdn.microsoft.com/zh-cn/library/aa970069.aspx示例

如果您想要更多... WPF之类的东西,则应查看CodePlex上的WPF Contrib项目,该项目具有一个NotifyIcon控件,可以在XAML中创建该控件,并使用标准WPF菜单(因此您可以粘贴“任何内容”)。


2

我在这里创建了一个项目,并使用了嵌入式资源(将构建操作设置为“嵌入式资源”,而不只是资源)。该解决方案不适用于Resource,但是您可以操纵它。我把它放在OnIntialized()上,但不必去那里。

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

2
仅供参考-我读了我的MS WPF MCTS培训工具包,不使用嵌入式资源,因为它使用了其他资源管理方案,而WPF无法访问该方案。不知道那是什么意思,只是
顺其自然-ScottG

@ScottG如果要在创建主窗口之前加载资源,则使用URI可能不起作用。因此,您需要嵌入图标并按照blackSphere的说明进行加载。就我而言,我必须在我的托盘应用程序的ApplicationContext中加载图标。
Supawat Pusavanno 2015年

2

如果您只是在寻找简单的答案,我认为这就是MyApp作为您的应用程序名称,而这就是您的应用程序的根名称空间名称的地方。您必须使用pack URI语法,但是将图标从嵌入式资源中拉出来不必那么复杂。

    <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">
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.