代码之家  ›  专栏  ›  技术社区  ›  awe

如何在Web服务器控件中嵌入静态图像资源?

  •  2
  • awe  · 技术社区  · 14 年前

    我将创建一个表示TreeView的Web服务器控件。所以我想用两张图片来表示+和-展开/折叠。如何将其构建到控件中,以在页面上呈现时用作图像源?

    因为这将在编译后的Web控件库中,所以我不想依赖Web应用程序中的外部图像。

    编辑:
    基于 this answer 通过 安德烈·克雷默 我做了以下工作:

    在assemblyinfo.vb中:

    <Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.Resources.plus.gif", "image/gif")> 
    <Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.Resources.minus.gif", "image/gif")> 
    

    在我的 RenderContents 超越:

    Dim lPlusImage As New WebControls.Image()
    Dim lMinusImage As New WebControls.Image()
    lPlusImage.ImageUrl = Page.ClientScript.GetWebResourceUrl(Me.GetType(), "MyCompany.MyWebControls.Resources.plus.gif")
    lMinusImage.ImageUrl = Page.ClientScript.GetWebResourceUrl(Me.GetType(), "MyCompany.MyWebControls.Resources.minus.gif")
    lPlusImage.RenderControl(output)
    lMinusImage.RenderControl(output)
    

    我的程序集名称是 MyWebControls .

    我的根命名空间是 MyCompany.MyWebControls .

    图像 plus.gif minus.gif 位于名为的文件夹中 Resources 和图像 构建动作 设置为 嵌入式资源 .

    它仍然不起作用。我没有错误。我已经在浏览器中直接尝试了生成的图像URL,bot什么也没有发生,只是一个空白页。

    注:
    我试图在资源名中使用一个无效的路径,结果完全相同,这让我想知道是否需要做一些特殊的事情来将实际资源映射到资源名。只有在代码中使用与assemblyinfo中指定的名称不同的名称时,才会出现404未找到错误,这与路径指向实际资源无关!

    编辑:

    我找到了 solution 你说什么?

    我发现这是C和VB的区别。看到我自己 answer 关于这个问题。

    3 回复  |  直到 9 年前
        1
  •  4
  •   Andre Kraemer    9 年前

    将这两个图像添加到TreeView控件项目的名为“图像”的子文件夹中。然后将属性网格中的构建操作从内容更改为嵌入资源。

    除此之外,还必须在assemblyinfo.cs文件中将这两个映像注册为程序集的嵌入资源,如下所示:

    [assembly: System.Web.UI.WebResource("YourProjectsNameSpace.Images.plus.gif", "img/gif")]
    [assembly: System.Web.UI.WebResource("YourProjectsNameSpace.Images.minus.gif", "img/gif")]
    

    由于这些图像现在将嵌入到控件程序集中,因此可以使用ClientScriptManager访问它们,如下所示:

    string plusImageUrl  = Page.ClientScript.GetWebResourceUrl(this.GetType(), "YourProjectsNameSpace.Images.plus.gif");
    string minusImageUrl  = Page.ClientScript.GetWebResourceUrl(this.GetType(), "YourProjectsNameSpace.Images.minus.gif");
    
        2
  •  2
  •   awe    14 年前

    好的,我在 this article . 我相信安德烈·克雷默是公认的答案,因为他给我指明了正确的方向。他不知道C和VB在名称结构上有细微差别!

    以下是适用于VB的解决方案:

    重要的区别是,在VB中,文件路径不包含在名称中。

    在我的示例中,项目中的根命名空间是 MyCompany.MyWebControls 图像文件位于名为 Resources . 在C中,子文件夹是资源名称结构的一部分,但不在VB中。

    在c中,这是:

    [assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.Resources.plus.gif", "image/gif")]
    

    在VB中,必须忽略资源名路径中的文件路径:

    <Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.plus.gif", "image/gif")> 
    

    因此,当我们知道这一点时,我的完整例子是:

    在assemblyinfo.vb中:

    <Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.plus.gif", "image/gif")> 
    <Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.minus.gif", "image/gif")> 
    

    在我的 RenderContents 超越:

    Dim lPlusImage As New WebControls.Image()
    Dim lMinusImage As New WebControls.Image()
    lPlusImage.ImageUrl = Page.ClientScript.GetWebResourceUrl(Me.GetType(), "MyCompany.MyWebControls.plus.gif")
    lMinusImage.ImageUrl = Page.ClientScript.GetWebResourceUrl(Me.GetType(), "MyCompany.MyWebControls.minus.gif")
    lPlusImage.RenderControl(output)
    lMinusImage.RenderControl(output)
    

    瞧,它起作用了!

        3
  •  1
  •   sashaeve    14 年前

    您的图像->属性->生成操作->嵌入资源。它将与控件或库一起编译。