在aspnetforums工程中的moderation里面保存着若干.ascx文件,这些文件就是相对应的engine中的同名控件的皮肤。具体的控制方法是这样的:
在aspnetforums工程中的moderation里面保存着若干.ascx文件,这些文件就是相对应的engine中的同名控件的皮肤(例如Skin-Navigation.ascx对应engine中的NavigationMenu.cs,在NavigationMenu.cs中有一行:string skinFilename = "Skin-Navigation.ascx"; 就是设置皮肤的)皮肤的装载在控件的父控件SkinnedForumWebControl的LoadSkin()方法中完成,在LoadSkin()方法中首先通过skinFilename获得皮肤ascx文件真实所在的目录并通过Page.LoadControl方法装载到页面中,具体代码如下:
string skinPath = Globals.ApplicationVRoot + "/skins/" + SkinName + "/Skins/" + SkinFilename;
// Do we have a skin?
if (SkinFilename == null)
throw new Exception("The SkinName property of the control must be set.");
// Attempt to load the control. If this fails, we're done
try {
skin = Page.LoadControl(skinPath);
}
这样,就实现了在LoadSkin()方法中装载页面控件(也就是皮肤),而LoadSkin()方法在基类SkinnedForumWebControl中的重载方法CreateChildControls()中被调用,这样就实现了在创建控件的同时装载与该控件相对应的皮肤(ascx文件)。
CreateChildControls方法是这样重写的:
protected override void CreateChildControls() {
Control skin;
// Load the skin
skin = LoadSkin();
// Initialize the skin
InitializeSkin(skin);
Controls.Add(skin);
}
注意其中的InitializeSkin(skin);方法,该方法在SkinnedForumWebControl中被定义为:
protected abstract void InitializeSkin(Control skin);
而在子类中该方法被实现,具体到NavigationMenu.cs类,在该类的InitializeSkin方法中,程序首先通过一系列的FindControl方法获得原先从皮肤Skin-Navigation.ascx中装载的HyperLink控件。然后根据当前的用户状态决定哪些控件显示,哪些不显示。由于在NavigationMenu.cs类的父类SkinnedForumWebControl中的重载方法CreateChildControls()中调用了InitializeSkin方法,这样就使得子类NavigationMenu.cs的InitializeSkin方法在CreateChildControls()中被调用。这样就实现了其InitializeSkin方法中对各种HyperLink的控制。
打印 | 张贴于 2004-04-03 22:31:00 | Tag:暂无标签