本主题论述了编辑器的内部组织。 本主题描述了所使用的类,并说明了如何将编辑器用于容器控件中的内置编辑。
编辑器的类结构
实际的编辑器类都是 BaseEdit 的子类。 这些类表示可以放置到窗体上的独立控件。 这些也是在某个编辑器被激活时 (例如在编辑单元格取值时) 由容器创建的控件。 注意,BaseEdit 类仅实现了基本的内部类结构,并且没有推出任何编辑器功能,而只是声明了支持公共外观与感觉、外观及工具提示机制的成员、以及容器控件使用内置编辑器所必需的成员。
每个编辑器控件都有其相关联的 repository 项。 Repository 项是存储了编辑器设置和事件处理程序的对象。 可以通过编辑器的 BaseEdit.Properties 属性来访问这些对象。 注意,在创建内置编辑器时,实际上是创建了一个 repository 项对象。 这是可行的,因为由 repository 项提供的设置足以创建全功能的编辑器。 按照上面的声明,外观与感觉、外观及工具提示机制在实际的编辑器类中被实现。 因此,在创建某个内置编辑器时,不需要访问这些设置 (或需要它们)。 这些设置由拥有内置编辑器的容器控件控制,并且在使用独立编辑器时,仅需要定制这些设置。
另外两个重要的类是 Painter 和 ViewInfo 类。 当使用内部的 CreatePainter 和 CreateViewInfo 方法创建 repository 项时, 它们被初始化。 ViewInfo 类 (例如 DateEditViewInfo) 包含了一组用于绘制该控件的必要属性。 当必须绘制控件 (或重绘) 时,Painter 类 (例如 PainterTextEdit) 使用由 ViewInfo 类提供的信息来执行此任务。
下面的插图举例说明了一个编辑器的内部结构。 Repository 项能够创建所有其他类。
这种类结构的结果是,可以独立使用这些控件,或者作为其他控件 (例如 XtraGrid) 的内置编辑器。 让我们考虑一个用于编辑器网格列值的编辑器。 在这种情况下,新的 RepositoryItem 子类被创建在网格的 EditorContainer.RepositoryItems 集合中。 该类初始了 Painter 和 ViewInfo 类。 这两个类被用于绘制列内的所有单元格。 并且,巧妙的地方在于 Painter 和 ViewInfo 类是与编辑器类相分离的,允许绘制所有单元格而无须实际创建控件。 仅当某个单元格被编辑并且在编辑完成时被移除时,才创建编辑器类本身。
在创建自定义编辑器控件时,需要遵循这种编辑器结构,以便于容器控件可以适当地管理该自定义编辑器。
文本编辑器
XtraEditors 库的中文本编辑器由 TextEdit 类及其子类呈现。 在内部,每个 Developer Express 文本编辑器都有一个实现了文本输入功能的文本框。 文本编辑器是文本框的封装,并把其他元素添加到了文本框 (边框和按钮)。
文本框是由 DevExpress.XtraEditors.TextBoxMaskBox (是 System.Windows.Forms.TextBox 控件的子对象) 类表示的。 典型地,需要直接使用 DevExpress.XtraEditors.TextBoxMaskBox 控件。 但是在特定情况下,可以由某些功能返回此控件; 例如,当某个文本编辑器获得焦点时,窗体的 ActiveControl 属性将返回此编辑器的文本框 (DevExpress XtraEditors TextBoxMaskBox 对象),而不是编辑器本身。 要获取此编辑器,可以读取文本框的 Parent 属性。 要获得特定编辑器对应的 DevExpress.XtraEditors.TextBoxMaskBox 对象,可以使用 TextEdit.MaskBox 属性。