行为服务概述

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

AdornerGlyph 对象

Adorner 是设计图面和用户之间的一个不可见层。 Adorner 可包含 Glyph 对象,这些对象都是轻量呈现的对象。 Glyph 可由行为服务进行点击测试,并且它可以公开一个 Behavior 对象;只要 Glyph 根据其点击测试报告出 true,该对象就可以是活动的 Behavior

虽然**“Windows 窗体设计器”**仍支持原来的针对拖动和鼠标移动的 ControlDesigner 重写,但这些操作已实现为 Behavior 对象。 下表列出了一个简单控件的设计器中的元素,该控件包含一组普通的拖动手柄。

行为元素

说明

选择装饰器

一个装饰层处理所有用于选择的 UI Glyph 对象。

主体标志符号

完全透明的主体 Glyph 位于控件的顶部。 它的行为处理所有鼠标交互。

抓取标志符号

抓取 Glyph 对象为控件绘制抓取手柄。 它们的 Behavior 对象控制拖动操作。

扩展设计时用户界面

使用 BehaviorService 模型,可以轻松地在现有设计器用户界面上添加新功能。 新的 UI 仍将独立于前面定义的其他 GlyphBehavior 对象。 例如,某些控件上的智能标记是通过控件 (智能标记标志符号) 右上角的 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 类有一些支持拖放操作的方法(如 OnDragEnterOnGiveFeedback)。

大多数方法返回布尔值,指示是否已处理事件。 拖放事件在 DragEventArgs 参数中有一个值。 可通过从 FindCommand 方法返回菜单项来添加或删除单个菜单项。 FindCommand 方法与 DisableAllCommands 属性共同指定 MenuCommand 对象如何与行为进行交互。

装饰器

可以将 Adorner 视为与用户界面相关的元素(由 Glyph 对象构成)和 BehaviorService 之间的代理。

可以启用和禁用各个 Adorner。 只有启用的 Adorner 对象会从 BehaviorService 接收点击测试和绘制消息。

在将 Adorner 添加到 BehaviorServiceBehaviorServiceAdornerCollection 中时,该集合设置 BehaviorService 属性,以便 Adorner 可回调到 BehaviorService

调用 Adorner 对象的 Invalidate 方法会强制关联的 BehaviorService 刷新 Adorner 窗口。

推送行为

向行为堆栈添加 Behavior 对象最简单的方法是使用 Glyph 对象,但这不是唯一的方法。 Glyph 对象自身就可以将 Behavior 对象推送到行为堆栈上,您还可以直接将 Behavior 对象推送到行为堆栈上。 请考虑您要在设计图面上来回拖动移动手柄的具体情形。 不必编写逻辑来跟踪用户何时拖动,Glyph 自己会使用行为堆栈按顺序执行下列操作。

  1. Glyph 有一个关联的 Behavior 用于响应鼠标按下操作。

  2. 按下鼠标按钮时,Glyph 将一个新的 Behavior 推送到行为堆栈中。 此 Behavior 处理移动鼠标和释放鼠标事件。 它还可以禁用所有菜单命令,能够在拖动过程中禁止执行键盘快捷方式或其他命令。

  3. 释放鼠标按钮时,Behavior 终结移动手势并将其自身从行为堆栈弹出。 这就自动还原了以前的 Behavior

备注

BehaviorService 体系结构依赖于 Windows 窗体模型,因此不支持其他显示技术,如 Web 窗体。

请参见

参考

BehaviorService

Glyph

Adorner

EventHandler

其他资源

扩展设计时支持