如何(正确)将Form及其资源(如图像)导出为Item模板?

时间:2014-05-02 15:28:22

标签: c# vb.net winforms visual-studio templates

我正在使用 VisualStudio 2013 ,我想将 VS项目模板导出为我已写过的表单。

我使用了4张自定义图片(磁盘上的本地资源):

enter image description here

当然我需要导出图像(这是我第一次尝试在模板中导出资源),当我创建Item模板时问题就开始了:

enter image description here

然后我创建一个新项目来测试我的新Item模板:

enter image description here

但是当我尝试加载我的Item模板时,该模板被假定为具有Form和" 所有dependandt文件,包括资源文件"资源不包括在内,我收到了这些错误:

enter image description here

(在设计师档案中:)

Me.ToolStripButton_SendToClipboard.Image = Global.TestSolution.My.Resources.Resources.Clipboard
  

剪贴板不是TestSolution.My.Resources.Resources

的成员

(请注意错误消息中' Resources'名称空间被写入2次...是)

......等其他3张图片。

那我该怎么办?

我想要我的' ErrorDialog '表单已经过安全化,只需将其作为项目模板加载到任何类型的项目中,而不必担心这些资源。

PS:导出的' ErrorDialog.resx"表文件不包含四个图像中的任何一个,并且我不知道如何手动添加它们是否可以在 .ZIP 模板。

  

更新

我试图解压缩压缩模板以进行手动更改(以便能够加载fuc 图像)然后我已经复制/粘贴在模板解决方案的根目录中了"资源"包含4个图像的文件夹,所以我有这个文件夹' ** C:\ VS项目模板\我的项目模板\资源',之后我在设计师中做了这个更改: / p>

由此:

Me.ToolStripButton_SendToClipboard.Image = Global.$rootnamespace$.My.Resources.Clipboard

对此:

Me.ToolStripButton_SendToClipboard.Image = Image.FromFile(".\Resources\Clipboard.png")

我认为相对路径应指向' C:\ VS项目模板\我的项目模板\资源**',但不要相对路径正在我加载项目模板的项目的工作目录中搜索,例如,如果我在' ** C:\ VS Projects \ MyProject \ Solution.sl '中创建一个新项目。然后我在设计时加载项目模板,然后在' C:\ VS Projects \ MyProject \ Resources \ Image.png '中搜索图像,以便' ** \资源**'我指定的不是在项目模板的根文件夹中搜索图像。

也许可以修复在上面的相对路径中指定任何类型的VS全局变量?。

(这是一个足够接近的意图)

  

更新2

如果有人可以检查如何将对话框导出为包含图像的项目模板,那么这是源代码......真的不是。

http://www.mediafire.com/download/f6caca6bcc9wbwc/Elektro+ErrorDialog.rar

1 个答案:

答案 0 :(得分:1)

您遇到的问题是,当图片位于项目资源中时,您正在导出表单项。结果,图像不存在。导出过程不像代码分析那样工作,并运行代码以查看您可能分配给它的内容;它依赖于RESX文件中的“静态”引用。

解决方案是通过添加ImageList组件(它不是控件)并将所需图像添加到其中来将图像转换为RESX形式。这样,它们存储在 表单的resx中,如下所示:

<data name="ImageList1.ImageStream" 
         mimetype="application/x-microsoft.net.object.binary.base64">
 <value>
    AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvb
    LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFA
    ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDA
    (etc)

然后这应该导出到模板,但我认为DLL方法更适合你正在做的事情。