【问题标题】:How do I use an icon that is a resource in WPF?如何使用作为 WPF 中资源的图标?
【发布时间】:2010-09-09 14:56:24
【问题描述】:

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

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

【问题讨论】:

标签: wpf resources icons


【解决方案1】:

您的图标文件应添加到您的项目程序集之一,其构建操作应设置为资源。添加对程序集的引用后,您可以像这样创建一个 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 );

【讨论】:

  • 图标创建后不要忘记处理 iconStream。
  • 感谢这个例子,我终于知道了如何在我的应用程序的引用程序集中获取资源:new Uri("pack://application:,,,/YourReferencedAssembly;component/YourPossibleSubFolder/YourResourceFile. ico")
  • 这是否允许图标有多种分辨率?
  • @tofutim 不。当图标文件中还有 32px 版本时,所有可能的方法都不使用 16px 图标。窗口和图标是一个闪亮但悲伤的故事。
【解决方案2】:

一种常见的使用模式是让通知图标与主窗口的图标相同。图标被定义为 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">

【讨论】:

  • 请注意,您应该使用资源设计器添加图标,然后将构建操作设置为 Resource 以使其正常工作。
【解决方案3】:

好吧,您不想使用 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 菜单(所以你可以在菜单中粘贴“任何东西”)。

【讨论】:

    【解决方案4】:

    如果您只是在寻找简单的答案,我认为这就是 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">
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 仅供参考 - 我在我的 MS WPF MCTS 培训工具包中读到不要使用嵌入式资源,因为它使用了不同的资源管理方案,而 WPF 无法访问该方案。不知道这意味着什么,但只是传递
      • @ScottG 如果您想在创建主窗口之前加载资源,则使用 URI 可能不起作用。因此,您需要嵌入图标并按照 blackSphere 的描述加载。就我而言,我必须在我的 ApplicationContext 中为我的托盘应用程序加载图标。
      猜你喜欢
      • 2021-10-26
      • 1970-01-01
      • 2014-11-01
      • 2011-05-03
      • 2014-11-18
      相关资源
      最近更新 更多