Postup: definovat speciální tah pro modelování diagramu
V aplikaci Visual Studio Ultimate můžete definovat příkazy, které jsou prováděny, když uživatel poklepe nebo že přetažena položky do diagramu UML.Tato rozšíření lze zabalit do rozšíření integrace aplikace Visual Studio (VSIX) a distribuovat ostatním uživatelům Visual Studio Ultimate.
Pokud je již vestavěné chování pro typ diagramu a typ prvku, který chcete přetáhnout, nebudete moci přidat nebo změnit toto chování.
Požadavky
Visual Studio SDK, které můžete získat z Galerie Visual Studio.
Visual Studio vizualizace a modelování SDK, které můžete získat z Visual Studio vizualizace a modelování SDK v galerii kódů.
Vytvoření obslužné rutiny gesto
Chcete-li definovat popisovač speciální tah pro návrháře UML, vytvořte třídu, která definuje chování obslužnou rutinu tah a vložit v Visual Studio integrace rozšíření (VSIX) pro danou třídu.Souboru VSIX funguje jako kontejner, který lze instalovat obslužnou rutinu.Definování obslužné rutiny gesto dva alternativní způsoby:
Vytvořte obslužnou rutinu tah ve vlastním souboru VSIX pomocí šablony projektu. To je rychlejší metodu.Pomocí ní v případě, že nechcete kombinovat s jinými typy rozšíření, jako je například ověření rozšíření, položky vlastní panel nástrojů nebo příkazy nabídek vaši obslužnou rutinu.
Vytvořte obslužnou rutinu samostatný tah a projekty VSIX. Tuto metodu použijte, pokud chcete sloučit několik typů rozšíření do stejného souboru VSIX.Například pokud vaše obslužná rutina gesto předpokládá, že model dodržovat zvláštní obtíže, může ho vložíte do stejné VSIX jako metodu ověřování.
Vytvořte obslužnou rutinu tah ve vlastním souboru VSIX
V Nový projekt dialogovém okně vyberte v seznamu Modelování projektů, vyberte Rozšíření speciální tah pro.
Otevřít .cs soubor v novém projektu a upravit GestureExtension třídy implementovat vaši obslužnou rutinu tah.
Další informace naleznete v tématu provádění obslužná rutina speciálního tahu pro funkci.
Testování obslužnou rutinu tah stisknutím klávesy F5.Další informace naleznete v tématu spuštění obslužné rutiny speciálního tahu pro funkci.
Instalovat obslužnou rutinu tah v jiném počítači zkopírováním souboru bin\*\*.vsix je sestavena projektu.Další informace naleznete v tématu instalaci obslužná rutina speciálního tahu pro funkci.
Zde je alternativní postup:
Vytvoření projektu knihovny (DLL) samostatné třídy obslužné rutiny gesto
Vytvořte projekt knihovny tříd, buď v nové Visual Studio řešení, nebo do existujícího řešení.
V nabídce Soubor zvolte položku Nový, Projekt.
Podle Nainstalované šablony, rozbalte položku Visual C# nebo jazyka Visual Basic, v prostředním sloupci zvolte Knihovny tříd.
Přidejte následující odkazy do vašeho projektu.
Microsoft.VisualStudio.Modeling.Sdk.11.0
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.11.0
Microsoft.VisualStudio.ArchitectureTools.Extensibility
Microsoft.VisualStudio.Uml.Interfaces
System.ComponentModel.Composition
System.Windows.Forms
Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer– Musíte to pouze v případě, že jsou rozšíření diagramech vrstev.Další informace naleznete v tématu Rozšíření diagramy vrstvy.
Přidejte soubor třídy do projektu a jeho obsahu nastavena na následující kód.
[!POZNÁMKA]
Změňte název oboru názvů a třídy přednost.
using System.ComponentModel.Composition; using System.Linq; using System.Collections.Generic; using Microsoft.VisualStudio.Modeling.Diagrams; using Microsoft.VisualStudio.Modeling.Diagrams.ExtensionEnablement; using Microsoft.VisualStudio.Modeling.ExtensionEnablement; using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml; using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation; using Microsoft.VisualStudio.Uml.AuxiliaryConstructs; using Microsoft.VisualStudio.Modeling; using Microsoft.VisualStudio.Uml.Classes; // ADD other UML namespaces if required namespace MyGestureHandler // CHANGE { // DELETE any of these attributes if the handler // should not work with some types of diagram. [ClassDesignerExtension] [ActivityDesignerExtension] [ComponentDesignerExtension] [SequenceDesignerExtension] [UseCaseDesignerExtension] // [LayerDesignerExtension] // Gesture handlers must export IGestureExtension: [Export(typeof(IGestureExtension))] // CHANGE class name public class MyGesture1 : IGestureExtension { [Import] public IDiagramContext DiagramContext { get; set; } /// <summary> /// Called when the user double-clicks on the diagram /// </summary> /// <param name="targetElement"></param> /// <param name="diagramPointEventArgs"></param> public void OnDoubleClick(ShapeElement targetElement, DiagramPointEventArgs diagramPointEventArgs) { // CHANGE THIS CODE FOR YOUR APPLICATION. // Get the target shape, if any. Null if the target is the diagram. IShape targetIShape = targetElement.CreateIShape(); // Do something... } /// <summary> /// Called repeatedly when the user drags from anywhere on the screen. /// Return value should indicate whether a drop here is allowed. /// </summary> /// <param name="targetMergeElement">References the element to be dropped on.</param> /// <param name="diagramDragEventArgs">References the element to be dropped.</param> /// <returns></returns> public bool CanDragDrop(ShapeElement targetMergeElement, DiagramDragEventArgs diagramDragEventArgs) { // CHANGE THIS CODE FOR YOUR APPLICATION. // Get the target element, if any. Null if the target is the diagram. IShape targetIShape = targetMergeElement.CreateIShape(); // This example allows drag of any UML elements. return GetModelElementsFromDragEvent(diagramDragEventArgs).Count() > 0; } /// <summary> /// Execute the action to be performed on the drop. /// </summary> /// <param name="targetDropElement"></param> /// <param name="diagramDragEventArgs"></param> public void OnDragDrop(ShapeElement targetDropElement, DiagramDragEventArgs diagramDragEventArgs) { // CHANGE THIS CODE FOR YOUR APPLICATION. } /// <summary> /// Retrieves UML IElements from drag arguments. /// Works for drags from UML diagrams. /// </summary> private IEnumerable<IElement> GetModelElementsFromDragEvent (DiagramDragEventArgs dragEvent) { //ElementGroupPrototype is the container for //dragged and copied elements and toolbox items. ElementGroupPrototype prototype = dragEvent.Data. GetData(typeof(ElementGroupPrototype)) as ElementGroupPrototype; // Locate the originals in the implementation store. IElementDirectory implementationDirectory = dragEvent.DiagramClientView.Diagram.Store.ElementDirectory; return prototype.ProtoElements.Select( prototypeElement => { ModelElement element = implementationDirectory .FindElement(prototypeElement.ElementId); ShapeElement shapeElement = element as ShapeElement; if (shapeElement != null) { // Dragged from a diagram. return shapeElement.ModelElement as IElement; } else { // Dragged from UML Model Explorer. return element as IElement; } }); } } }
Další informace o tom, co do metody, viz provádění obslužná rutina speciálního tahu pro funkci.
Příkaz nabídky je nutné přidat do projektu VSIX, který se chová jako kontejner pro instalaci příkazu.Pokud chcete, můžete zahrnout další součásti stejné VSIX.
Pro přidání obslužné rutiny pro samostatné speciálního projektu VSIX
Tento postup není nutné, pokud jste vytvořili obslužnou rutinu tah s vlastním VSIX.
Vytvořte projekt VSIX, pokud vaše řešení již existuje.
V Průzkumníku, v místní nabídce řešení, zvolte Přidat, Nový projekt.
Podle Nainstalované šablony, rozbalte položku Visual C# nebo jazyka Visual Basic, vyberte rozšíření.V prostředním sloupci zvolte Projekt VSIX.
Projekt VSIX nastavte jako projekt při spuštění řešení.
- V Průzkumníku řešení vyberte v místní nabídce Projekt VSIX nastavit jako projekt při spuštění.
V source.extension.vsixmanifest, přidat projekt knihovny tříd obslužnou rutinu tah jako Komponenta MEF:
Na MetaData karta, nastavte název souboru VSIX.
Na Instalaci cíle karta, sady Visual Studio Ultimate a prémie jako cíle.
Na majetku , vyberte Novýa v dialogovém okně nastavit:
Typ = Komponenta MEF
Zdroj = projektu v aktuálním řešení.
Projekt = váš projekt knihovny tříd
Spuštění obslužné rutiny gesto
Pro testovací účely spusťte vaši obslužnou rutinu tah v režimu ladění.
Chcete-li testovat obslužné rutiny gesto
Stiskněte klávesu F5, nebo ladění nabídky, klepněte na tlačítko Spuštění ladění.
Experimentální instanci Visual Studio spustí.
Poradce při potížích s: je-li nový Visual Studio se nespustí:
Pokud máte více než jeden projekt, ujistěte se, že projekt VSIX je nastavit jako projekt při spuštění řešení.
V místní nabídce po spuštění nebo pouze projekt v Průzkumníku řešení, vyberte příkaz Vlastnosti.V editoru vlastnosti projektu, zvolte ladění kartu.Ujistěte se, že řetězec spustit externí program pole je úplná cesta k Visual Studio, obvykle:
C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe
V experimentální Visual Studio, otevřít nebo vytvořit projekt modelování a otevření nebo vytvoření diagramu modelu.Pomocí diagramu, který patří k jednomu z typů uvedených v atributy třídy obslužné rutiny speciálního tahu pro funkci.
Poklepejte na libovolné místo v diagramu.Vaše obslužná rutina poklepání by měla být volána.
Přetáhněte element z Průzkumníku UML do diagramu.Vaše obslužná rutina přetáhněte by měla být volána.
Poradce při potížích s: je-li obslužnou rutinu tah nefunguje, ujistěte se, že:
Projekt obslužnou rutinu tah je uveden jako Komponenta MEF v majetku karta v source.extensions.manifest v projektu VSIX.
Parametry všech Import a Export atributy jsou platné.
CanDragDrop Metoda nevrací false.
Typ modelu diagramu, které používáte (UML třída, sekvence a tak dále) je uveden jako jeden z speciálního tahu pro funkci obslužné rutiny třídy atributů [ClassDesignerExtension], [SequenceDesignerExtension] a tak dále.
Neexistuje žádné vestavěné funkce, které jsou již definovány pro tento typ cíle a vyřazených prvkem.
Provádění obslužná rutina gesto
Metody obslužné rutiny gesto
Speciální tah pro třídu obslužné rutiny implementuje a exportuje IGestureExtension.Metody, které je třeba definovat jsou následující:
bool CanDragDrop (ShapeElement target, DiagramDragEventArgs dragEvent) |
Vrátí true umožňující prvek zdroje, které jsou odkazovány v dragEvent zavěsit na tento cíl. Tato metoda neprovádějte změny modelu.By měl fungovat rychle, protože se používá k určení stavu šipku, jak uživatel přesune ukazatel myši. |
void OnDragDrop (ShapeElement target, DiagramDragEventArgs dragEvent) |
Aktualizovat model založený na zdrojový objekt, který je odkazován v dragEventa cíl. Volána, když uživatel uvolní tlačítko myši po přetažení. |
void OnDoubleClick (ShapeElement target, DiagramPointEventArgs pointEvent) |
targetje tvar, který jste poklepali uživatele. |
Můžete napsat obslužné rutiny, které lze přijímat nejen UML také celou řadu dalších položek, jako jsou soubory, uzly v zobrazení tříd rozhraní .NET, uzly Průzkumníka architektury a tak dále.Uživatele můžete přetáhnout některou z těchto položek do diagramu UML Pokud píšete OnDragDrop metodu, která lze dekódovat serializovaném formátu položky.Dekódování metod liší jednoho druhu zboží.
Parametry těchto metod jsou:
ShapeElement target.Tvar nebo diagram, do kterého má uživatel něco přetáhli.
ShapeElementje třída provedení, který je základem UML modelování nástroje.Chcete-li snížit riziko uvedení modelu UML a diagramů do nekonzistentním stavu, doporučujeme používat metody této třídy přímo.Místo toho zalomit element v IShapea pak pomocí metod popsaných v Jak: zobrazení v diagramech modelu.
Chcete-li získat IShape:
IShape targetIShape = target.CreateIShape(target);
Chcete-li získat model element, který je určen pomocí přetahování nebo poklepejte na ikonu operace:
IElement target = targetIShape.Element;
Můžete obsadit, tím více určitým typem prvku.
Chcete-li získat úložiště modelu UML, která obsahuje UML model:
IModelStore modelStore = targetIShape.Element.GetModelStore();
Chcete-li získat přístup k hostiteli a poskytovatel metadat:
target.Store.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE
DiagramDragEventArgs eventArgs.Tento parametr nese serializovaném formátu zdrojového objektu operace přetažení:
System.Windows.Forms.IDataObject data = eventArgs.Data;
Můžete přetáhnout prvky z mnoha různých druhů na diagramu z různých částí Visual Studio, nebo z plochy systému Windows.Různé typy prvků, které jsou kódovány různými způsoby v IDataObject.Z něj extrahovat prvky, naleznete v dokumentaci pro příslušný typ objektu.
Je-li zdrojovým objektem prvku UML, který je přetažen z Průzkumníka modelů UML nebo jiný diagram UML, naleznete v Jak: získat z IDataObject prvky modelu UML.
Psaní kódu metody
Další informace o psaní kódu ke čtení a aktualizaci modelu naleznete v tématu Programování v rozhraní API UML.
Informace o přístupu k informacím modelu v operaci přetažení naleznete v tématu Jak: získat z IDataObject prvky modelu UML.
Pokud se zabýváte se sekvenčním diagramu, viz také Postup: úprava sekvenční diagramy pomocí rozhraní API UML.
Kromě parametrů metody můžete také deklarovat importované vlastnost ve vaší třídě, která poskytuje přístup k aktuálním diagramu a modelu.
[Import] public IDiagramContext DiagramContext { get; set; }
Prohlášení o IDiagramContext umožňuje napsat kód ve vaší metody, které přistupuje k diagramu, aktuální výběr a model:
IDiagram diagram = this.DiagramContext.CurrentDiagram;
foreach (IShape<IElement> shape in diagram.GetSelectedShapes<IElement>)
{ IElement element = shape.Element; ... }
IModelStore modelStore = diagram.ModelStore;
IModel model = modelStore.Root;
foreach (IDiagram diagram in modelStore.Diagrams) {...}
foreach (IElement element in modelStore.AllInstances<IUseCase>) {...}
Další informace naleznete v tématu Jak: navigace modelu UML.
Instalace a odinstalace rozšíření
Je možné nainstalovat Visual Studio rozšíření ve vašem počítači i v jiných počítačích.
Chcete-li nainstalovat rozšíření
V počítači, vyhledejte .vsix soubor, který byl vytvořen společností projektu VSIX.
V Průzkumníku, v místní nabídce Projekt VSIX, zvolte Otevřít složku v Průzkumníku Windows.
Vyhledejte soubor bin\*\YourProject.vsix
Kopie .vsix souboru na cílovém počítači, ve kterém chcete instalovat rozšíření.Může se jednat o vlastní počítač nebo jiný.
Cílový počítač musí mít jednu z edice sady Visual Studio zadaný v source.extension.vsixmanifest.
V cílovém počítači spusťte .vsix souboru.
Visual Studio Instalační služba rozšíření otevře a nainstaluje rozšíření.
Spustit nebo restartovat Visual Studio.
Chcete-li odinstalovat rozšíření
Na Nástroje nabídce zvolte Extension Manager.
Rozbalte nainstalována rozšíření.
Vyberte rozšíření a pak zvolte Odinstalace.
Jen zřídka chybná rozšíření nenačte a vytvoří sestavu v chybovém okně, ale nezobrazí ve Správci rozšíření.V takovém případě můžete odebrat rozšíření odstraněním souborů z:
% LocalAppData %\Local\Microsoft\VisualStudio\11.0\Extensions
Příklad
Následující příklad ukazuje, jak vytvořit životnosti v sekvenčním diagramu na základě části a porty součásti přetaženým z diagramu komponent.
Chcete-li otestovat, stiskněte klávesu F5.Experimentální instanci aplikace Visual Studio otevře.V tomto případě otevřete UML model a vytvořit komponentu v diagramu komponent.Přidejte tuto součást některá rozhraní a vnitřní součásti.Vyberte rozhraní a částí.Potom přetáhněte rozhraní a části sekvenčního diagramu.(Přetažením z diagramu komponent až na ouško sekvenčního diagramu a potom dolů do sekvenčního diagramu.) Životnost se zobrazí pro každé rozhraní a část.
Další informace o vázání interakcí pro sekvenční diagramy, viz Postup: úprava sekvenční diagramy pomocí rozhraní API UML.
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
using Microsoft.VisualStudio.Modeling.Diagrams.ExtensionEnablement;
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
using Microsoft.VisualStudio.Uml.AuxiliaryConstructs;
using Microsoft.VisualStudio.Uml.Classes;
using Microsoft.VisualStudio.Uml.Interactions;
using Microsoft.VisualStudio.Uml.CompositeStructures;
using Microsoft.VisualStudio.Uml.Components;
/// <summary>
/// Creates lifelines from component ports and parts.
/// </summary>
[Export(typeof(IGestureExtension))]
[SequenceDesignerExtension]
public class CreateLifelinesFromComponentParts : IGestureExtension
{
[Import]
public IDiagramContext Context { get; set; }
/// <summary>
/// Called by the modeling framework when
/// the user drops something on a target.
/// </summary>
/// <param name="target">The target shape or diagram </param>
/// <param name="dragEvent">The item being dragged</param>
public void OnDragDrop(ShapeElement target,
DiagramDragEventArgs dragEvent)
{
ISequenceDiagram diagram = Context.CurrentDiagram
as ISequenceDiagram;
IInteraction interaction = diagram.Interaction;
if (interaction == null)
{
// Sequence diagram is empty: create an interaction.
interaction = diagram.ModelStore.Root.CreateInteraction();
interaction.Name = Context.CurrentDiagram.Name;
diagram.Bind(interaction);
}
foreach (IConnectableElement connectable in
GetConnectablesFromDrag(dragEvent))
{
ILifeline lifeline = interaction.CreateLifeline();
lifeline.Represents = connectable;
lifeline.Name = connectable.Name;
}
}
/// <summary>
/// Called by the modeling framework to determine whether
/// the user can drop something on a target.
/// Must not change anything.
/// </summary>
/// <param name="target">The target shape or diagram</param>
/// <param name="dragEvent">The item being dragged</param>
/// <returns>true if this item can be dropped on this target</returns>
public bool CanDragDrop(ShapeElement target,
DiagramDragEventArgs dragEvent)
{
IEnumerable<IConnectableElement> connectables = GetConnectablesFromDrag(dragEvent);
return connectables.Count() > 0;
}
///<summary>
/// Get dragged parts and ports of an IComponent.
///</summary>
private IEnumerable<IConnectableElement>
GetConnectablesFromDrag(DiagramDragEventArgs dragEvent)
{
foreach (IElement element in
GetModelElementsFromDragEvent(dragEvent))
{
IConnectableElement part = element as IConnectableElement;
if (part != null)
{
yield return part;
}
}
}
/// <summary>
/// Retrieves UML IElements from drag arguments.
/// Works for drags from UML diagrams.
/// </summary>
private IEnumerable<IElement> GetModelElementsFromDragEvent
(DiagramDragEventArgs dragEvent)
{
//ElementGroupPrototype is the container for
//dragged and copied elements and toolbox items.
ElementGroupPrototype prototype =
dragEvent.Data.
GetData(typeof(ElementGroupPrototype))
as ElementGroupPrototype;
// Locate the originals in the implementation store.
IElementDirectory implementationDirectory =
dragEvent.DiagramClientView.Diagram.Store.ElementDirectory;
return prototype.ProtoElements.Select(
prototypeElement =>
{
ModelElement element = implementationDirectory
.FindElement(prototypeElement.ElementId);
ShapeElement shapeElement = element as ShapeElement;
if (shapeElement != null)
{
// Dragged from a diagram.
return shapeElement.ModelElement as IElement;
}
else
{
// Dragged from UML Model Explorer.
return element as IElement;
}
});
}
public void OnDoubleClick(ShapeElement targetElement, DiagramPointEventArgs diagramPointEventArgs)
{
}
}
Kód GetModelElementsFromDragEvent() je popsán v Jak: získat z IDataObject prvky modelu UML.
Viz také
Koncepty
Postup: definovat a nainstalujte rozšíření modelování
Rozšíření modelů UML a diagramů
Postup: definování příkazu nabídky diagramu modelování