在WPF EXE中嵌入多个图标

时间:2009-12-02 12:20:50

标签: c# wpf xaml icons

我有一个WPF程序集,我想在其中嵌入五个图标,用于与我的应用程序关联的不同文件类型。 如何将这些图标嵌入我的EXE?

@smoore @Groky @ChrisF,谢谢。 不幸的是,这不是我的要求。我看到我的问题非常模糊0_°。让我重新解释一下这个问题:


我在我的WPF项目中有图标,比如Application.icoDocument.ico等作为资源。我在大多数情况下通过以下方式访问这些图标:

<Image Source="/MyAssembly;component/Resources/Icons/Application.ico" />

每次都有效。我知道。


我的问题是如何将Windows资源管理器中的相同图标用于注册表中的文件关联。我希望能够通过以下路径访问图标:

C:\Program Files\MyApp\MyApp.exe,1

与图标如何与HKEY_CLASSES_ROOT中的文件类型相关联。

AFAIK,我应该使用资源文件(.rc),编译并将其与我的EXE合并。有点像:

101 RT_ICON Application.ico
102 RT_ICON Document.ico
// etc...

这是WPF中的正确方法吗?有没有替代方案,特别是因为这种方法似乎导致我的AssemblyInfo.cs删除了程序集版本。我仍然准备在资源中编写版本控制信息而不是程序集的信息。

5 个答案:

答案 0 :(得分:4)

我找到了一个解决方案!它并不完美,但却能满足我的需求!由于我用了很长的斯堪的纳维亚之夜来找到解决方案,我觉得我必须在这里分享。

这就是我的所作所为:

1)写了一个愚蠢的控制台C#app。

class ResTest {
    static void Main() {
        System.Console.WriteLine("Hello World!");
    }
}

2)用一个简单的csc restest.cs来测试我的代码是否有效。

3)打开记事本并在我称为App.rc的文件中写下以下内容。

101 ICON "Application.ico"
102 ICON "Document.ico"
103 ICON "Help.ico"

4)跑rc /v App.rcResource Compiler。出现了一个新文件App.res

5)Reran csc但这一次:

csc /win32res:App.res restest.cs

6)restest.exe现在有一个ID为101的图标,我可以在Axialis IconWorkshop中找到另外两个图标。


现在,我注意到我的装配信息(版本,产品名称,等等等等 blah )已经消失。我用Google搜索了VS_VERSION_INFO并介绍了MSDN关于VERSIONINFO结构的文章,它在RC文件中定义了我需要的属性。

我希望采用更“自动化”的方法,但我必须尽我所能使用C#Express和Windows Vista SDK。

- 希望你能用这个......

答案 1 :(得分:3)

  1. 创建App.rc:

    101 ICON "Application.ico"
    102 ICON "Document.ico"
    103 ICON "Help.ico"
    
  2. 编译:

    rc App.rc
    
  3. 将App.res添加到您的项目中(将None作为您的构建操作)。
  4. 构建
  5. 全部完成!

答案 2 :(得分:2)

项目属性 - &gt;资源 - &gt;添加资源 - &gt;添加新图标/添加现有文件(取决于您是否已经创建了图标)

答案 3 :(得分:2)

我刚刚创建了一个简单的工具来完成这一操作,而不必弄乱.res文件。 (如果您管理自己的.res文件,则不会自动创建清单和版本资源)。它是一个很小的实用程序,您可以将其用作Post-Build事件的一部分,并允许您将特定文件夹中的所有图标文件添加到程序集中。如果我们假设您在主项目文件夹下有一个icons文件夹,则可以添加以下构建后事件:

C:\path\to\InsertIcons.exe $(TargetPath) $(ProjectDir)icons

可以在http://einaregilsson.com/add-multiple-icons-to-a-dotnet-application/

找到进一步的说明和下载

答案 4 :(得分:1)

除了将文件添加到项目资源之外,您还可以将文件添加到项目中,并将其Build Action设置为资源。

然后,您可以使用Source属性从XAML引用文件。例如,目录“Resources”中的文件Icon.png将使用:

加载
<Image Source="/Resources/Icon.png"/>

要从您将使用的代码加载文件:

new BitmapImage(new Uri(@"pack://application:,,,/Resources/Icon.png"))