Jak: přístup a zachovat aktuální výběr
Při zápisu popisovač příkazu nebo speciálního tahu pro domény specifické pro jazyk, můžete určit, jaký prvek klepli pravým tlačítkem myši uživatele.Můžete také zabránit některé obrazce nebo pole vybraná.Například můžete uspořádat, že uživatel klepne ikonu decorator, tvar, který jej obsahuje vyberete místo.Omezení výběru tímto způsobem snižuje počet popisovačů, které mají k zápisu.Je také usnadňuje pro uživatele, který může klepnutím kdekoli ve tvaru bez nutnosti vyhnout decorator.
Přístup k aktuální výběr z popisovač příkazu
Třída nastavení příkazu pro domény specifické pro jazyk obsahuje příkaz rutiny pro vlastní příkazy.CommandSet Třídy, ze které pochází třídy sadu příkazů pro domény specifické pro jazyk, obsahuje několik členů pro přístup k aktuální výběr.
V závislosti na příkazu může být nutné popisovač příkazu výběr Návrhář modelů, Průzkumník modelu nebo aktivní okno.
Přístup k informacím o výběru
CommandSet Třída definuje následující členy, které lze použít pro přístup k aktuální výběr.
Člen
Description
Vrátí true prvky v modelu designer-li obrazec prostoru pro cestující; jinak false.
Metoda IsDiagramSelected
Vrátí true Pokud je diagram v Návrháři modelu; jinak false.
Metoda IsSingleDocumentSelection
Vrátí true Pokud je přesně jeden prvek v Návrhář modelů; jinak false.
Metoda IsSingleSelection
Vrátí true Pokud je přesně jeden prvek v aktivním okně; jinak false.
CurrentDocumentSelectionVlastnost
Získá jen pro čtení kolekci prvků, vybrali v Návrháři modelu.
CurrentSelectionVlastnost
Získá jen pro čtení kolekci prvků v aktivním okně.
SingleDocumentSelectionVlastnost
V Návrháři modelu získá primární prvek výběru.
SingleSelectionVlastnost
Získá primární prvek výběru v aktivním okně.
CurrentDocView Vlastnost CommandSet třída poskytuje přístup k DiagramDocView objekt, který představuje model okna návrháře a poskytuje přístup další vybrané prvky modelu návrháře.
Kromě toho generovaný kód definuje vlastnost okno Nástroj Průzkumník a nastavit vlastnost explorer výběru příkazu třídy pro domény specifické pro jazyk.
Okno vlastností pro nástroj explorer vrátí instanci třídy okna Průzkumník nástroj pro domény specifické pro jazyk.Třída okna Nástroj Průzkumník je odvozen z ModelExplorerToolWindow třídy a představuje Průzkumníka modelů pro domény specifické pro jazyk.
[ExplorerSelection] Vrátí vlastnost vybraného prvku v okně Průzkumníka modelu pro domény specifické pro jazyk.
Určení aktivního okna
IMonitorSelectionService Obsahuje rozhraní definuje členy, které poskytují přístup k aktuálnímu stavu výběru v prostředí.Můžete získat IMonitorSelectionService objektu třídy balíčku nebo třídy nastavení příkazu jazyka specifické pro doménu pomocí [MonitorSelection] vlastnosti definované v každé základní třídy.Třída balíčku je odvozen z ModelingPackage třídy a příkaz set je odvozen z CommandSet třídy.
Z popisovače příkazu určit, jaký typ okna je aktivní
MonitorSelection Vlastnost CommandSet třídy vrátí IMonitorSelectionService objekt, který poskytuje přístup k aktuálním stavu výběru v prostředí.
CurrentSelectionContainer Vlastnost IMonitorSelectionService rozhraní získá aktivní výběr kontejneru, který může být jiné než aktivní okno.
Přidáte že následující vlastnosti příkazu jazyka třídy můžete konkrétní domény určit, jaký typ okna je aktivní.
// 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); } }
Omezení výběru
Přidáním pravidla výběru můžete určit prvky, které jsou vybrány, když uživatel vybere element v modelu.Například chcete-li umožnit uživateli počet prvků považovat za jednu jednotku, můžete použít pravidla výběru.
Vytvořit pravidlo výběru
Vytvoření souboru vlastního kódu v projektu DSL
Definovat třídu pravidlo výběru, která je odvozena z DiagramSelectionRules třídy.
Přepsat GetCompliantSelection metoda třídy pravidlo výběru použít kritéria výběru.
Přidat definici dílčí třídy [ClassDiagram] třídy k souboru vlastního kódu.
[ClassDiagram] Je odvozen ze třídy Diagram třídy a je definován v kódu generovaného souboru, Diagram.cs, v projektu DSL.
Přepsat SelectionRules vlastnost [ClassDiagram] třídy vrátit vlastní výběr pravidlo.
Výchozí implementace SelectionRules získá vlastnost objektu pravidlo výběru, která neprovádí úpravy výběru.
Příklad
Následující kód soubor vytvoří pravidlo výběru, které rozšíří výběr všech instancí každého obrazce domény, které byla původně vybrána.
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;
}
}
}
}
}