如何:访问和约束当前所选内容
当您编写的域特定语言 (dsl) 命令或笔势处理程序,可以确定元素用户使用了鼠标右键单击。 您还可以防止某些形状或域中选择。 例如,可以使,当用户单击图标修饰器时,包含它的形状中选择。 限制选定内容来减少必须编写处理程序的数目。 它还便于用户,任何位置在形状中单击,而不必避免一个修饰器。
访问当前选择从命令处理程序
域特定语言 (dsl) 的命令设置的类包含自定义命令的命令处理程序。 CommandSet 类,命令来设置为域特定语言 (dsl) 类派生,提供了一些成员访问当前选择。
根据命令,命令处理程序在模型设计器、模型资源管理器或活动窗口可能需要选定内容。
访问选择信息
CommandSet 类定义可用于访问当前选择的以下成员。
成员
说明
,如果在模型设计器中选择的任何元素是形状隔离舱,返回 true ;否则, false。
,如果关系图模型设计器中,选中返回 true ;否则, false。
,如果一个元素在模型设计器,正确地选择返回 true ;否则, false。
,如果一个元素在活动窗口,正确地选择返回 true ;否则, false。
获取在模型设计器中选择的元素的只读集合。
获取在活动窗口选元素的只读集合。
获取选定内容的主要元素在模型设计器的。
获取选定内容的主要元素在活动窗口的。
CommandSet 类的 CurrentDocView 属性提供对表示模型设计器窗口并提供附加的访问模型设计器的所选元素的 DiagramDocView 对象。
此外,生成的代码定义一个资源管理器工具窗口属性和一个资源管理器选择属性在命令设置的类域特定语言的。
资源管理器工具窗口属性返回资源管理器工具窗口类的实例。域特定语言 (dsl)。 资源管理器工具窗口类从 ModelExplorerToolWindow 类派生并表示该域特定语言 (dsl) 模型资源管理器。
[ExplorerSelection] 属性返回在模型资源管理器窗口的选定元素。域特定语言 (dsl)。
确定哪个窗口处于活动状态
IMonitorSelectionService 接口包含定义提供对 shell 中当前选定状态的成员。 可以从获取或包类的一 IMonitorSelectionService 对象或域特定语言指令设置的类通过 [MonitorSelection] 属性在每个元素的基类定义。 包类从 ModelingPackage 类派生,并且,命令设置的类从 CommandSet 类派生。
从命令处理程序确定哪种类型的窗口处于活动状态
CommandSet 类的 MonitorSelection 属性返回提供对 shell 中当前选定状态的 IMonitorSelectionService 对象。
IMonitorSelectionService 接口的 CurrentSelectionContainer 属性获取活动选择容器,可能与活动窗口不同。
将以下特性添加到您的命令设置的类域特定语言确定哪种类型的窗口处于活动状态。
// using Microsoft.VisualStudio.Modeling.Shell; // Returns true if the model designer is the active selection container; // otherwise, false. protected bool IsDesignerActive { get { return (this.MonitorSelection.CurrentSelectionContainer is DiagramDocView); } } // Returns true if the model explorer is the active selection container; // otherwise, false. protected bool IsExplorerActive { get { return (this.MonitorSelection.CurrentSelectionContainer is ModelExplorerToolWindow); } }
选择约束
通过将选中该规则,可以控制哪些元素处于选中状态,当用户选择设计时的元素。 例如,允许用户将多个元素作为一个单元,可以使用选择规则。
创建选择规则
创建自定义代码文件在 DSL 项目
定义从 DiagramSelectionRules 类派生的选择规则类。
重写选择规则类的 GetCompliantSelection 方法将选择条件。
添加 [ClassDiagram] 类的分部类定义与自定义代码文件。
[ClassDiagram] 类从 Diagram 类在生成的代码文件, Diagram.cs 派生且已定义,在 DSL 项目。
重写 [ClassDiagram] 类的 SelectionRules 属性返回自定义选中该规则。
SelectionRules 属性的默认实现获取未修改选定内容的选择规则对象。
示例
下面的代码文件创建展开选定内容中每一所有实例字段形状最初选择一种选择规则。
using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
namespace CompanyName.ProductName.GroupingDsl
{
public class CustomSelectionRules : DiagramSelectionRules
{
protected Diagram diagram;
protected IElementDirectory elementDirectory;
public CustomSelectionRules(Diagram diagram)
{
if (diagram == null) throw new ArgumentNullException();
this.diagram = diagram;
this.elementDirectory = diagram.Store.ElementDirectory;
}
/// <summary>Called by the design surface to allow selection filtering.
/// </summary>
/// <param name="currentSelection">[in] The current selection before any
/// ShapeElements are added or removed.</param>
/// <param name="proposedItemsToAdd">[in/out] The proposed DiagramItems to
/// be added to the selection.</param>
/// <param name="proposedItemsToRemove">[in/out] The proposed DiagramItems
/// to be removed from the selection.</param>
/// <param name="primaryItem">[in/out] The proposed DiagramItem to become
/// the primary DiagramItem of the selection. A null value signifies that
/// the last DiagramItem in the resultant selection should be assumed as
/// the primary DiagramItem.</param>
/// <returns>true if some or all of the selection was accepted; false if
/// the entire selection proposal was rejected. If false, appropriate
/// feedback will be given to the user to indicate that the selection was
/// rejected.</returns>
public override bool GetCompliantSelection(
SelectedShapesCollection currentSelection,
DiagramItemCollection proposedItemsToAdd,
DiagramItemCollection proposedItemsToRemove,
DiagramItem primaryItem)
{
if (currentSelection.Count == 0 && proposedItemsToAdd.Count == 0) return true;
HashSet<DomainClassInfo> itemsToAdd = new HashSet<DomainClassInfo>();
foreach (DiagramItem item in proposedItemsToAdd)
{
if (item.Shape != null)
itemsToAdd.Add(item.Shape.GetDomainClass());
}
proposedItemsToAdd.Clear();
foreach (DomainClassInfo classInfo in itemsToAdd)
{
foreach (ModelElement element
in this.elementDirectory.FindElements(classInfo, false))
{
if (element is ShapeElement)
{
proposedItemsToAdd.Add(
new DiagramItem((ShapeElement)element));
}
}
}
return true;
}
}
public partial class ClassDiagram
{
protected CustomSelectionRules customSelectionRules = null;
protected bool multipleSelectionMode = true;
public override DiagramSelectionRules SelectionRules
{
get
{
if (multipleSelectionMode)
{
if (customSelectionRules == null)
{
customSelectionRules = new CustomSelectionRules(this);
}
return customSelectionRules;
}
else
{
return base.SelectionRules;
}
}
}
}
}