在现代软件开发中,用户界面的灵活性和可扩展性是至关重要的。本文将介绍一种基于状态机和XML配置的WinForms控件设计方法,这种方法可以创建高度自适应的用户界面组件。这些组件可以作为工具栏、工具箱或热点控件,用于各种应用程序。
称之为开放组控件(Open Group Control,简称OGC),因为它包含并管理一个可扩展的元素组。与普通工具栏相比,OGC的优势在于不需要编写用户代码来处理控件的内部元素及其关系。OGC为用户提供了可重用的、已经编译(并且希望已经调试)的模块,包含一些有用的工具和机制(例如错误处理)。
控件的元素应该遵循特定的规则:实现特殊的接口IElement
,并放置在单独的程序集中。如果元素被实例化,那么元素的程序集将由控件动态加载。这意味着元素可以是不同类型的(非WinForms控件类型或基于WinForms控件的类型),并且可以在不改变控件本身的情况下开发新元素类型。因此,OGC允许通过设计新类型的元素来扩展。
目前,已经实现了两种类型的元素,分别使用以下类:OGCVisualElement
- 热点元素,图像作为多状态按钮;OGCComboBox
- 组合框。元素类是在单独的动态加载程序集中实现的。
控件包含一组元素。每个元素都有几种不同的状态。元素状态的向量形成了整个控件的状态(控件的状态)。这种关系由控件状态矩阵表示。通过激活元素(例如,点击热点元素,选择组合框中的项目),用户使控件从一个状态过渡到另一个状态。
每个元素的这种过渡规则应该由元素的状态转换矩阵定义。XML配置文件包含控件的控件状态矩阵和每个元素的状态转换矩阵。矩阵结构在文件Additional_Notes.html
中有详细说明,该文件可以与本文一起加载。
程序集OGCLib
包含基本类型和接口定义:OGControl
- 提供鼠标操作、控件的状态机、停靠和错误处理机制的主要OGC功能,启动元素的几何修改;Configurator
- 负责使用XML文件配置OGC;ErrorEventArgs
- 此类的对象用作错误处理委托的参数;包含错误严重性和消息。
该程序集包含以下接口的定义:IElement
- 元素类型的基类;IFactory
- 元素类型程序集中元素实例化的工厂类基类。
程序集OGCVisualElementLib
和OGCComboBoxLib
包含适当的基于IElement
的元素类OGCVisualElement
和OGCComboBox
。这些程序集是通过OGControl.AddElement()
方法使用反射技术动态加载的。
整个控件的配置数据都放在XML文件中。文件OGCErrorMessages.xml
包含所有错误消息模板。目前,此文件的名称是硬编码的,可能无法更改。从XML中读取错误消息模板允许用户配置错误消息并以他们的母语接收它。所有OGC及其元素在应用程序中共享此信息。控件使用Configurator
类读取与其元素相关的数据。基于这些数据,控件加载适当的程序集并实例化请求的元素,使用程序集的Factory : IFactory
类。
要创建具有最小功能的OGC,父窗体应该调用OGC构造函数,传递XML配置文件的名称作为参数,并将新实例化的控件添加到其控件列表中:
C# Controls.Add(new OGControl("Configurator.xml"));
应该实现处理OGC的StateChangedEvent
和ErrorEvent
静态事件的委托:
C# delegate void StateChangedEventHandler(OGControl source, EventArgs ea);
C# delegate void ErrorEventHandler(OGControl source, ErrorEventArgs eea);
为了增强功能,可以重写一些虚方法,如OnChangeState()
和ConstructTip()
。
这些可以下载。示例可以使用__RunMe_First_To_Build.bat
批处理文件构建。批处理文件_Run_Example_1.bat
和_Run_Example_2.bat
允许运行两个相关示例。文件Additional_Notes.html
提供了矩阵结构和示例的更详细说明,而文件Data_to_Examples.txt
包含示例的控件状态矩阵。