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

时间:2010-02-15 09:44:37

标签: asp.net vb.net image embedded-resource servercontrols

我将创建一个表示树视图的Web服务器控件。所以我想使用2个图像用于+和 - 用于展开/折叠。如何在页面上呈现时以可用作图像源的方式将其构建到控件中?

由于这将在编译的Web控件库中,因此我不想依赖Web应用程序中的外部图像。

修改
基于this answer Andre Kraemer ,我做了以下事情:

在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.gifminus.gif位于名为Resources的文件夹中,图片的构建操作设置为嵌入式资源

它仍然不起作用。我没有错。我已经在浏览器中直接尝试了生成的图像url,bot没有任何反应,只是一个空白页面。

注意:
我试图在资源名称中使用无效路径,结果完全相同,这让我想知道是否需要做一些特殊的事情来将实际资源映射到资源名称。只有当我在代码中使用的名称不同于AssemblyInfo中指定的名称时,我才会收到404 Not Found错误,它与路径指向实际资源没有任何关系!

修改

我找到了solution

我发现它是C#和VB之间的区别。请参阅我自己answer的问题。

3 个答案:

答案 0 :(得分:4)

将这两个图像添加到名为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");

答案 1 :(得分:2)

好的,我在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)

瞧,它有效!

答案 2 :(得分:1)

您的图片 - &gt;属性 - &gt;构建行动 - &gt;嵌入式资源。它将与您的控件或库一起编译。