| public class MyControl : CompositeControl{ // 相关代码 ...... // 定义初始值 private int _cellPadding = 0; private int _border = 1; ...... // 定义样式属性,它和Table控件的样式属性CellPadding和Border类似 public int CellPadding{ get { return _cellPadding; } set { _cellPadding = value; } // 实现属性Border public int Border{ get { return _border; } set { _border = value; } ...... // 重写CreateChildControls方法 protected override void CreateChildControls() { //相关代码 ...... Table t = new Table(); //将前面定义的属性添加到键/值对中 t.AddAttributes.Add("CellPadding",_cellPadding.ToString()); t.AddAttributes.Add("Border",_border.ToString()); ...... } } |
以上代码显示了MyControl的一些关键源代码,其重点在于说明实现部分样式属性冒泡的关键步骤。(1)初始化顶级样式属性的字段,如果有必要可以定义初始值。(2)定义与需要升级的子控件的样式属性相同名称的属性。上面的代码中定义了属性CellPadding和Border。(3)在子控件的Attributes的键/值对中引入第2步中定义的属性。
当设置MyControl中的样式属性CellPadding和Border的属性值时,实际是设置Table子控件的CellPadding和Border的属性值。通过以上3个关键步骤就可实现样式冒泡。
如果读者仔细观察可以发现,以上介绍的这种实现样式冒泡的方法存在一些问题:一、这种方法只适用于升级子控件中少数样式属性。如果需要将子控件的所有样式属性都升级,而仍然使用这种方法,则实现起来非常繁琐,容易产生错误。二、所实现的样式属性缺乏逻辑性和组织性。在某种情况下,例如,多个子控件的同一样式属性都需要升级为顶级属性,这时使用该方法将会引起混乱。
为了解决这些问题,下面介绍一种上传子控件全部样式属性的实现方法。
2、上传全部样式属性
在上一节中,说明了有关实现复合控件样式的内容,但是,那种实现方法只能实现子控件部分的样式,并且缺乏逻辑性和组织性。本小节介绍的实现复合控件样式属性的方法有效避免了以上问题。它实现了多重委托的属性,即对每个子控件分别定义Width、Height等样式,更进一步的讲,即实现每个子控件对应的Style类型的复杂样式属性,例如,TextBoxStyle、ButtonStyle。通过这种方式子控件的样式属性就上传为顶层属性,以便于设置子控件的外观。