转换很容易,甚至可以完全自动化。它只需要更改您希望嵌入 ASCX 控件的 DLL 项目中的一些设置和基类。
1... 对于每个 UserControl,将 ASCX 文件的 Build Action(在 Properties 下)设置为“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”的类将需要其 ASCX 文件位于子文件夹“Namespace1\Namespace2”中,因此它嵌入名称为“ProjectName.Namespace1.Namespace2”。类名.ascx"。
就是这样!编译 DLL 并将其包含在另一个项目中后,您可以使用“new”运算符实例化用户控件的实例,就像任何其他类一样。与往常一样,一旦将您的控件作为子控件添加到页面或页面上的另一个控件,您的控件将“赶上”当前页面事件。