转换很简单,甚至可以完全自动化。它只需要在需要嵌入ASCX控件的DLL项目中更改一些设置和基类。
1 ...对于每个UserControl,将ASCX文件的Build Action(属性下)设置为“Embedded Resource “,并删除其关联的设计器文件。
2 ...保存该项目。
3 ...右键单击该项目并选择“卸载项目”。
4 ...再次右键单击并选择“编辑* .csproj”选项。
看起来像这样(其中星号代表你的类名)段改为:
<Compile Include="*.ascx.cs">
<DependentUpon>*.ascx</DependentUpon>
<SubType>ASPXCodeBehind</SubType>
</Compile>
看起来像这样
<Compile Include="*.ascx.cs" />
这将导致代码隐藏文件单独编译的ASCX文件。
5 ...保存更改,然后右键单击该项目并选择“重新加载项目”。
6 ...打开所有“* .ascx.cs”文件,并使它们从以下自定义UserControl类继承,而不是System.Web.UI.UserControl类(您可能需要找到父类类来完成这一步)。
public class UserControl : System.Web.UI.UserControl
{
protected override void FrameworkInitialize()
{
base.FrameworkInitialize();
string content = String.Empty;
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetType().FullName + ".ascx");
using (StreamReader reader = new StreamReader(stream))
content = reader.ReadToEnd();
Control userControl = Page.ParseControl(content);
this.Controls.Add(userControl);
}
}
这个基类将加载和分析嵌入式ASCX文件的照顾。
7 ...最后,你需要放置在子文件夹ASCX文件,使他们的资源名称(通过文件夹路径自动确定)匹配其关联的类的完整类型名称(加“的.ascx”)。假设您的根名称空间与您的项目名称相匹配,那么名为“ProjectName.Namespace1.Namespace2.ClassName”的类将需要子文件夹“Namespace1 \ Namespace2”中的ASCX文件,因此它会嵌入名称“ProjectName.Namespace1.Namespace2”。 ClassName.ascx”。
就是这样!一旦编译DLL并将其包含在另一个项目中,就可以像使用其他类一样使用“new”运算符实例化用户控件的实例。与往常一样,一旦将控件作为子控件添加到页面上的页面或另一个控件上,您的控件就会“抓住”当前页面事件。
你analized我粘贴的解决方案?它非常适合创建用户控制库。如果可能的话,我会避免创建用户控件库,但如果你没有选择看看文章 – 2010-05-10 21:35:51