Практическое руководство. Предоставление и ограничение доступа к текущему выделению
При написании обработчика команды или жеста для доменного языка, можно определить, какой элемент пользователь щелкнул правой кнопкой мыши.Также можно предотвратить некоторые фигуры или поля из быть выбран.Например, можно расположить, что, когда пользователь щелкает оформитель значка, форма, содержащая его выбрана.Ограничения выделения таким образом уменьшается число обработчиков, которые вам нужно будет написать.Это также упрощает для пользователя, который может щелкните в любом месте правой границе без избежать оформитель.
Доступ к текущее выделение из обработчика команды
Класс набора команд для доменного языка содержит обработчики команды для пользовательских команд.CommandSet класс, из которого класс набора команд для доменного языка является производным, предоставляет несколько элементов для доступа к текущее выделение.
В зависимости от команды, обработчик команды может выделение в конструкторе моделей, модель обозревателе или активном окне.
Для доступа к данным о выделении
CommandSet класс задает следующие элементы, которые можно использовать для доступа к текущее выделение.
Элемент
Описание
Возвращает true если любые элементы, выбранные в конструкторе моделей форма секции; в противном случае - false.
Метод IsDiagramSelected
Возвращает true если схема выбранной в конструкторе моделей. в противном случае - false.
Возвращает true если ровно один элемент выделен в конструкторе моделей. в противном случае - false.
Метод IsSingleSelection
Возвращает true если выбран только один элемент в активном окне. в противном случае - false.
Свойство CurrentDocumentSelection
Возвращает доступную только для чтения коллекцию элементов, выбранных в конструкторе моделей.
Свойство CurrentSelection
Возвращает доступную только для чтения коллекцию элементов, выбранных в активном окне.
Свойство SingleDocumentSelection
Получает основной элемент выделения в конструкторе моделей.
Свойство SingleSelection
Получает основной элемент выделения в активном окне.
CurrentDocView свойство CommandSet класс предоставляет доступ к DiagramDocView объект, представляющий окно конструктора моделей и предоставляет дополнительный доступ выбранные элементы в конструкторе моделей.
Кроме того, созданный код определяет свойство окна инструментов обозревателя и свойство выделения обозревателя в классе набора команд для доменного языка.
Свойство окна инструментов обозревателя возвращает экземпляр класса окна инструментов обозревателя для доменного языка.Класс окна инструментов обозревателя является производным от ModelExplorerToolWindow класс, представляющий обозреватель модели для доменного языка.
[ExplorerSelection] свойство возвращает выбранный элемент в окне обозреватель моделей для доменного языка.
Определение, окно активно
IMonitorSelectionService интерфейс содержит определяет элементы, которые обеспечивают доступ к состоянию текущего выделения в оболочке.Доступ IMonitorSelectionService объект от класса или класса пакета или набора команд для доменного языка через [MonitorSelection] свойство, определенное в базовом классе.Класс наследует из пакета ModelingPackage класс, и класса являются производными от набора команд CommandSet класс.
Указать из обработчика команды, какой тип окна активен
MonitorSelection свойство CommandSet возвращает класс IMonitorSelectionService объект, предоставляющий доступ к состоянию текущего выделения в оболочке.
CurrentSelectionContainer свойство IMonitorSelectionService интерфейс получает активный контейнер выделения, который может отличаться от активное окно.
Добавьте к классу следующие свойства набора команд для вас доменный язык, чтобы определить, какой тип окна активен.
// 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.
Переопределите SelectionRules свойство [ClassDiagram] класс для возвращения пользовательское правило выделения.
Реализация по умолчанию 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;
}
}
}
}
}