行为服务概述
BehaviorService 管理设计器中的用户界面。它为在设计时操作用户界面元素(例如与鼠标相关的事件、菜单命令和 OLE 拖放操作)提供了一种统一的方式。
在设计时管理用户界面
创作自定义设计时体验的一个关键方面是管理用户界面。通过创作自定义设计器,可以为自定义控件提供设计时体验。
作为设计器开发者,您可以创建您自己的用户界面层,我们称之为“装饰器”。在各层图面中,可以为绘制、拖动和其他 UI 操作创建您自己的 Glyph 类型。各 Glyph 都可以有一个关联的 Behavior 类型。Behavior 是一个具有所有用户输入(包括菜单命令、鼠标移动和 OLE 拖放操作)的重载的类。还可以独立于 Glyph 对象添加 Behavior 对象,以便它们可以挂钩到整个设计器的常规用户输入。前面提到的所有三种功能都是使用 Behavior 类型实现的。
说明 |
---|
必须添加对设计时程序集 System.Design.dll 的引用。此程序集不包含在 .NET Framework 4 Client Profile 中。若要添加对 System.Design.dll 的引用,必须将项目的目标框架更改为“.NET Framework 4”。 |
在 .NET Framework 1.1 版中,某些事件(如 OnMouseDragBegin)是由 ControlDesigner 类公开的。在此模型中,许多 UI 设计器逻辑是在 EventHandler 中实现的。因为在控件上有多个指定区域可供用户操作,所以此模型要求您编写大量支持逻辑。
Behavior 类型可解决此问题。BehaviorService 包括两部分。下表列出了这两部分并为各部分提供了说明。
组成部分 |
说明 |
---|---|
Behavior 类的堆栈 |
每个类都具有与菜单命令、OLE 拖放操作、鼠标事件等相关的方法。位于堆栈顶部的类是活动的 Behavior,所有用户输入都会被路由到该 Behavior。 |
Adorner 是设计图面和用户之间的一个不可见层。Adorner 可包含 Glyph 对象,这些对象都是轻量呈现的对象。Glyph 可由行为服务进行点击测试,并且它可以公开一个 Behavior 对象;只要 Glyph 根据其点击测试报告出 true,该对象就可以是活动的 Behavior。 |
虽然**“Windows 窗体设计器”**仍支持原来的针对拖动和鼠标移动的 ControlDesigner 重写,但这些操作已实现为 Behavior 对象。下表列出了一个简单控件的设计器中的元素,该控件包含一组普通的拖动手柄。
行为元素 |
说明 |
---|---|
选择装饰器 |
一个装饰层处理所有用于选择的 UI Glyph 对象。 |
主体标志符号 |
完全透明的主体 Glyph 位于控件的顶部。它的行为处理所有鼠标交互。 |
抓取标志符号 |
扩展设计时用户界面
使用 BehaviorService 模型,可以轻松地在现有设计器用户界面上添加新功能。新的 UI 仍将独立于前面定义的其他 Glyph 和 Behavior 对象。例如,某些控件上的智能标记是通过控件 () 右上角的 Glyph 来访问的。
智能标记代码创建其自己的 Adorner 层并向此层添加 Glyph 对象。这使得智能标记 Glyph 对象能够与用于选择的 Glyph 对象保持分离。向 Adorners 集合添加新的 Adorner 所需代码非常简单。
behaviorService = (BehaviorService)serviceProvider.GetService(typeof(BehaviorService));
designerActionAdorner = new Adorner();
behaviorService.Adorners.Add(designerActionAdorner);
Glyph dag = new DesignerActionGlyph(/*...*/);
designerActionAdorner.Glyphs.Add(dag);
标记符号和行为
Glyph 类型很简单。如果您需要复杂的功能,请将此类型添加到您自己的从 Glyph 派生的类。
Glyph 对象可以有 Behavior 对象,但并不是非有不可。没有 Behavior 对象的 Glyph 有一个会返回 null 的 Behavior 属性。
对于所支持的每个用户交互,Behavior 都有一个方法。例如,基 Behavior 类有一些支持拖放操作的方法(如 OnDragEnter 和 OnGiveFeedback)。
大多数方法返回布尔值,指示是否已处理事件。拖放事件在 DragEventArgs 参数中有一个值。可通过从 FindCommand 方法返回菜单项来添加或删除单个菜单项。FindCommand 方法与 DisableAllCommands 属性共同指定 MenuCommand 对象如何与行为进行交互。
装饰器
可以将 Adorner 视为与用户界面相关的元素(由 Glyph 对象构成)和 BehaviorService 之间的代理。
可以启用和禁用各个 Adorner。只有启用的 Adorner 对象会从 BehaviorService 接收点击测试和绘制消息。
在将 Adorner 添加到 BehaviorService 的 BehaviorServiceAdornerCollection 中时,该集合设置 BehaviorService 属性,以便 Adorner 可回调到 BehaviorService。
调用 Adorner 对象的 Invalidate 方法会强制关联的 BehaviorService 刷新 Adorner 窗口。
推送行为
向行为堆栈添加 Behavior 对象最简单的方法是使用 Glyph 对象,但这不是唯一的方法。Glyph 对象自身就可以将 Behavior 对象推送到行为堆栈上,您还可以直接将 Behavior 对象推送到行为堆栈上。请考虑您要在设计图面上来回拖动移动手柄的具体情形。不必编写逻辑来跟踪用户何时拖动,Glyph 自己会使用行为堆栈按顺序执行下列操作。
按下鼠标按钮时,Glyph 将一个新的 Behavior 推送到行为堆栈中。此 Behavior 处理移动鼠标和释放鼠标事件。它还可以禁用所有菜单命令,能够在拖动过程中禁止执行键盘快捷方式或其他命令。
说明 |
---|
BehaviorService 体系结构依赖于 Windows 窗体模型,因此不支持其他显示技术,如 Web 窗体。 |