(ViewState)
示例6
public class ImageLabel4 : Label
{
protected override Style CreateControlStyle()
{
return new LabelStyle(ViewState);
}
[Bindable(true),
Category("Appearance"),
DefaultValue(""),
Description("背景图片")
]
public virtual String ImageUrl
{
get { return ((LabelStyle)ControlStyle).ImageUrl; }
set { ((LabelStyle)ControlStyle).ImageUrl = value; }
}
}
让我们来测试一下,你会发现界面上并未呈现背景图片,给控件加一个属性CssClass=""以后效果就出来了,如下
让我们来思考为什么在未定义CssClass=""属性时无法呈现自定义属性.
Style类有一个IsEmpty属性用来判断已在的视图状态中是否定义了样式属性,
默认情况下为true,当定义了样式属性后,则为false.CssClass属性为空时,默认情况下即认为定义了样式属性,只不过样式属性个数为0.
若要在默认情况下呈现自定义样式属性则需重写IsEmpty属性.如下,只要判断自定义的样式属性视图状态是否为空即可.
示例7
//判断视图状态是否为空
internal bool IsSet(string key)
{
return ViewState[key] != null;
}
/**//// <summary>
/// 是否定义样式元素
/// </summary>
public override bool IsEmpty
{
get
{
return base.IsEmpty && !IsSet("imageUrl");
}
}
(2)使用编程
下面我们以编程方式,给控件添加自定义样式属性.
发现BackColor属性能够呈现但ImageUrl 无法呈现,那说明我们刚才自定义的类就失去意义了,也说明我们还未重写某个方法.
LabelStyle a = new LabelStyle();
a.ImageUrl = "images4.bmp";
a.BackColor = System.Drawing.Color.Red;
ImageLabel4_1.ApplyStyle(a);
Style类有三个操作样式的方法,复制,合并和清除样式.WebControl类也一样.重写一下,我们的目的就达到了.看下面代码
示例8
方法#region 方法
/**//// <summary>
/// 复制样式
/// </summary>
/// <param name=""></param>
public override void CopyFrom(Style s)
{
if (s == null)
return;
base.CopyFrom(s);
LabelStyle ls = s as LabelStyle;
if (ls == null || ls.IsEmpty)
return;
if (ls.IsSet("imageUrl"))
this.ImageUrl = ls.ImageUrl;
}
/**//// <summary>
/// 整合样式
/// </summary>
/// <param name="s"></param>
public override void MergeWith(Style s)
{
if (s == null)
return;
if (IsEmpty)
{
CopyFrom(s);
return;
}
LabelStyle ls = s as LabelStyle;
if (ls == null || ls.IsEmpty)
return;
if (ls.IsSet("imageUrl") && !IsSet("imageUrl"))
this.ImageU
|