从代码中访问资源以设置NotifyIcon.Icon

我想在WPF中获取NotifyIcon的图标。

所以我在一个Resources文件夹中添加了一个.ico文件到我的解决方案,并将构建操作设置为Resource

我试图在代码背后抓住这个资源,如下所示:

var icon = (Icon) Application.Current.FindResource("/Resources/icon.ico")

这不起作用。

除此之外: Application.Current.Resources.Count返回0

编辑

var i = new Icon(Application.GetResourceStream(new Uri("/systemtrayicon.ico", UriKind.Relative)).Stream);

将根中的图标和构建操作设置为Resource

还是行不通。

再次编辑:

我需要清理解决方案并按照以下方式重建: WPF在加载图像时抛出“无法找到资源”exception

您必须将resourceName作为参数传递给FindResource方法,而不是Resource的路径。 示例代码如下所示:

 var icon = (Icon) Application.Current.FindResource("myImage") 

请注意,在上面的示例代码中,“myImage”是资源名称。

请参阅MSDN上的Application.FindResource方法。

你说,Application.Current.Resources.Count为零,这意味着你没有在App.xaml文件中定义任何资源。

您可以像这样向App.xaml添加资源:

    

您的图标似乎是嵌入式资源。 FindResource无法使用嵌入式资源。 将您的图标的BuildAction设置为Resource

有关WPF资源的更多信息,请参阅此 MSDN页面。

UPDATE

访问嵌入式资源的代码

 Assembly.GetExecutingAssembly().GetManifestResourceStream("myImg.png"); 

但是,如果您已将此图像添加到Resources.Resx,您应该只能使用Resources.ResourceName

更新2

向App.xaml或任何ResourceDictionary添加资源更好,因此您可以通过StaticResourceDynamicResource标记扩展将它们用作静态/动态资源。

如果您不想将其添加到App.xaml资源并仍想访问它,我上面提到的一个选项是将它添加到Resources.Resx并使用Resources.ResourceName来引用图标/图像

另一种方法是自己创建System.Drawing.Icon ,示例代码:

 new System.Drawing.Icon(Application.GetResourceStream(new Uri("/Resources/icon.ico"))); 

就个人而言,我会使用XAML资源并将它们添加到App.xaml或ResourceDictionary。

这将100%有效

 ni.Icon = new Icon(Application.GetResourceStream(new Uri("pack://application:,,,")).Stream); 

例:

 notify.Icon = new Icon(Application.GetResourceStream(new Uri("pack://application:,,,/images/favicon.ico")).Stream);