【问题标题】:Accessing resources from code for setting NotifyIcon.Icon从代码访问资源以设置 NotifyIcon.Icon
【发布时间】:2013-12-20 20:41:54
【问题描述】:

我正在尝试在 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 throws "Cannot locate resource" exception when loading the image

【问题讨论】:

    标签: c# wpf embedded-resource notifyicon


    【解决方案1】:

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

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

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

    参考 MSDN 上的Application.FindResource 方法。

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

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

    <Application.Resources>
         <Image x:Key="myImage" Source="img.png" />
    </Application.Resources>
    

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

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

    更新

    用于访问嵌入式资源的代码

    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。

    【讨论】:

    • 那么我如何从代码中引用.ico 文件而不将它们添加到App.xaml 文件中。还是必须在 XAML 中访问或指定所有资源?
    • 不,您不必这样做。但 WPF/XAML 开发的首选方法。由于在您的问题中您提到它是一个资源(不是嵌入式资源),您可以尝试通过调用new System.Drawing.Icon(Application.GetResourceStream(new Uri("/Resources/icon.ico"))); 自己创建图标的方法
    • 这是我在您编辑之前已经尝试过的:new Icon(Application.GetResourceStream(new Uri("pack://application:,,,/systemtrayicon.ico")).Stream);。这是根中的图标和构建操作设置为Resource。抱怨找不到资源。
    • 让我在示例应用中尝试
    • 在示例应用程序中尝试过,它似乎可以正常工作。 new System.Drawing.Icon(Application.GetResourceStream(new Uri("orange.ico", UriKind.Relative)).Stream);
    【解决方案2】:

    这将 100% 有效

    ni.Icon = new Icon(Application.GetResourceStream(new Uri("pack://application:,,,<Image Location From root>")).Stream);
    

    示例:

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

    【讨论】:

    • 谢谢,简单易行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2014-09-13
    • 1970-01-01
    相关资源
    最近更新 更多