从代码中访问资源以设置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添加资源更好,因此您可以通过StaticResource
或DynamicResource
标记扩展将它们用作静态/动态资源。
如果您不想将其添加到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);