Jak: dostęp i ograniczyć bieżącego zaznaczenia.
Podczas pisania obsługi polecenia lub gestu dla danego języka specyficzne dla domeny, można określić elementu, jaki użytkownik kliknął prawym przyciskiem myszy.Można również zapobiec niektóre kształty lub pola wybrane.Na przykład można rozmieścić, że gdy użytkownik kliknie ikonę dekorator, kształt, który go zawiera jest zaznaczone w zamian.Ograniczanie wyboru w ten sposób zmniejsza liczbę programów obsługi, które trzeba napisać.To ułatwia również dla użytkownika, który można kliknąć dowolne miejsce w kształcie bez konieczności uniknięcia dekorator.
Uzyskiwanie dostępu do bieżącego zaznaczenia z obsługi polecenia
Klasy zestaw poleceń dla języka specyficzne dla domeny zawiera programy obsługi polecenia dla poleceń niestandardowych.CommandSet Klasy, z którego pochodzi klasy zestaw poleceń dla języka specyficzne dla domeny, zawiera kilka członków do uzyskiwania dostępu do bieżącego zaznaczenia.
W zależności od polecenia program obsługi polecenia może być konieczne zaznaczenie w projektancie modelu, Eksplorator modelu lub aktywnego okna.
Dostęp do informacji zaznaczenia
CommandSet Klasy definiuje następujące elementy, które mogą być używane do uzyskania dostępu do bieżącego zaznaczenia.
Członkowskie
Opis
Zwraca true Jeśli dowolne elementy zaznaczone w projektancie modelu jest kształt Przedział; w przeciwnym razie false.
IsDiagramSelectedMetoda
Zwraca true zaznaczenie diagramu w projektancie modelu; w przeciwnym razie false.
Zwraca true zaznaczenie dokładnie jeden element w projektancie modelu; w przeciwnym razie false.
IsSingleSelectionMetoda
Zwraca true zaznaczenie dokładnie jeden element w aktywnym oknie; w przeciwnym razie false.
CurrentDocumentSelectionWłaściwość
Pobiera zbiór elementy zaznaczone w projektancie modelu przeznaczone tylko do odczytu.
CurrentSelectionWłaściwość
Zwraca kolekcję tylko do odczytu elementy zaznaczone w aktywnym oknie.
SingleDocumentSelectionWłaściwość
Pobiera element podstawowy zaznaczenia w projektancie modelu.
SingleSelectionWłaściwość
Pobiera element podstawowy zaznaczenia w aktywnym oknie.
CurrentDocView Właściwość CommandSet klasy zapewnia dostęp do DiagramDocView obiekt, który reprezentuje okna Projektanta modelu i udostępnia dodatkowe wybrane elementy w projektancie modelu.
Ponadto wygenerowany kod definiuje explorer narzędzie okno właściwości i właściwość wyboru programu explorer w poleceniu set klasy dla języka specyficzne dla domeny.
Właściwość okna explorer narzędzie zwraca instancję klasy okna narzędzia explorer języka specyficzne dla domeny.Klasa okna explorer narzędzie pochodzi od ModelExplorerToolWindow klasy i reprezentuje Eksploratora modelu dla języka specyficzne dla domeny.
[ExplorerSelection] Właściwość zwraca zaznaczonego elementu w oknie Eksploratora modelu dla języka specyficzne dla domeny.
Określanie, które okno jest aktywne
IMonitorSelectionService Zawiera interfejs definiuje członków, które zapewniają dostęp do bieżącego stanu zaznaczenia w powłoce.Można uzyskać IMonitorSelectionService obiektu z klasy pakietu lub klasy zestaw poleceń dla języka specyficzne dla domeny za pomocą [MonitorSelection] właściwość zdefiniowana w klasie bazowej każdego.Klasa pakiet pochodzi od ModelingPackage klasa i klasa zestaw poleceń pochodzi od CommandSet klasy.
Aby ustalić z obsługi polecenia, jakiego rodzaju okno jest aktywne
MonitorSelection Właściwość CommandSet klasy zwraca IMonitorSelectionService obiekt, który zapewnia dostęp do bieżącego stanu zaznaczenia w powłoce.
CurrentSelectionContainer Właściwość IMonitorSelectionService interfejsu pobiera kontenera aktywnego zaznaczenia, w którym mogą się różnić od aktywnego okna.
Dodaj następujące właściwości z poleceniem set klasy dla Ciebie języka specyficzne dla domeny, aby ustalić, jakiego rodzaju okno jest aktywne.
// 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); } }
Ograniczanie wyboru
Dodając reguły wyboru, można kontrolować, które elementy są zaznaczone, gdy użytkownik wybierze element w modelu.Na przykład aby zezwolić użytkownikowi na traktowanie liczba elementów jako pojedynczą jednostkę, można użyć reguły wyboru.
Aby utworzyć reguły wyboru
Tworzenie pliku niestandardowego kodu w programie project DSL
Zdefiniowanie klasy reguły wyboru, która wywodzi się z DiagramSelectionRules klasy.
Zastąpić GetCompliantSelection metody klasy reguła wyboru zastosowania kryteriów wyboru.
Dodawanie definicji częściowej klasy dla [ClassDiagram] klasy do pliku niestandardowego kodu.
[ClassDiagram] Klasa pochodzi od Diagram klasy a jest zdefiniowany w pliku wygenerowanego kodu Diagram.cs, w programie project DSL.
Zastąpić SelectionRules właściwość [ClassDiagram] klasy, aby powrócić do reguły wyboru niestandardowego.
Domyślna implementacja z SelectionRules właściwość pobiera obiekt regułę wyboru, który nie Modyfikuj zaznaczenie.
Przykład
Następujący plik kod tworzy regułę wyboru, który poszerza zaznaczenie, aby uwzględnić wszystkie wystąpienia początkowo wybranych kształtów domeny.
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;
}
}
}
}
}