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

时间:2008-09-16 16:52:34

标签: wpf resources icons

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

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

5 个答案:

答案 0 :(得分:96)

您的图标文件应添加到您的某个项目程序集中,其Build Action应设置为Resource。添加对程序集的引用后,您可以像这样创建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 );

答案 1 :(得分: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">

答案 2 :(得分:12)

嗯,您不想使用resx样式资源:您只需将项目中的ico文件粘贴到文件夹中(例如“ArtWork”),然后在属性中将Build Action设置为“Resources”。 ..

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

请参阅此处:http://msdn.microsoft.com/en-us/library/aa970069.aspxsample

如果你想要更多......类似WPF,你应该查看CodePlex上的WPF Contrib项目,它有一个NotifyIcon控件,你可以在XAML中创建并使用标准的WPF菜单(所以你可以在菜单中粘贴“任何东西”。

答案 3 :(得分:2)

如果您只是寻找简单的答案,我认为这就是MyApp是您的应用程序名称以及应用程序的根命名空间名称的位置。您必须使用包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">

答案 4 :(得分:1)

我在这里创建了一个项目并使用了嵌入式资源(构建操作设置为嵌入式资源,而不仅仅是资源)。此解决方案不适用于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;
    }