Aracılığıyla paylaş


Nasıl yapılır: bir modelleme çizim hareketi işleyicisi tanımlamak

Visual Studio Ultimate'taki, kullanıcı çift tıkladığında veye öğeleri bir uml diyagram üzerine sürüklediğinde gerçekleştirilen komutlar tanımlayabilirsiniz.Visual Studio tümleştirme uzantısı bu uzantılar paketleyebilirsiniz (VSIX) ve Visual Studio Ultimate diğer kullanıcılara dağıtabilirsiniz.

Diyagram türü ve sürüklemek istediğiniz öğe türü için yerleşik davranış zaten varsa, bu davranışı eklemek veya geçersiz kılmak mümkün olmayabilir.

Gereksinimler

Hareket İşleyici Oluşturma

Bir UML tasarımcısı için bir hareket işleyicisi oluşturmak için hareket işleyicisinin davranışını belirleyen bir sınıf oluşturmanız ve bu sınıfı bir Visual Studio Tümleştirme Uzantısı'na (VSIX) katıştırmanız gerekir.VSIX işleyiciyi yükleyebilecek bir kapsayıcı gibi davranır.Bir hareket işleyicisini tanımlamanın iki farklı yöntemi var:

  • Proje şablonunu kullanarak kendi VSIX projesi içerisinde bir hareket işleyici oluşturun. Bu daha hızlı yöntemdir.İşleyicinizi doğrulama uzantıları, özel araç kutusu öğeleri veya menü komutları gibi diğer tür uzantılarla birleştirmek istemiyorsanız, bunu kullanın.

  • Ayrı hareket işleyicisi ve VSIX projeleri oluşturun. Aynı VSIX içinde bir kaç tür uzantıyı birleştirmek istiyorsanız bu yöntemi kullanın.Örneğin, hareket işleyiciniz modelin belirli kısıtlamalar ortaya koyacağını ön görüyorsa, bunu bir doğrulama yöntemi olarak aynı VSIX içine katıştırabilirsiniz.

Kendi VSIX'inde bir hareket işleyicisi oluşturmak için

  1. Yeni proje iletişim kutusunda, Modelleme Projeleri'nin altında, Hareket Uzantısı'nı tıklatın.

  2. Yeni projede .cs dosyasını açın ve hareket işleyicinizi uygulamak için GestureExtension sınıfını değiştirin.

    Daha fazla bilgi için bkz. Hareket İşlecini Uygulama.

  3. F5'e basarak hareket işleyicisini test edin.Daha fazla bilgi için bkz. Hareket İşlecini Yürütme.

  4. Hareket işleyicisini projeniz tarafından oluşturulan bin\*\*.vsix dosyasını kopyalayarak başka bir bilgisayara yükleyin.Daha fazla bilgi için bkz. Hareket İşlecini Kurma.

Alternatif yordam aşağıdadır:

Bir hareket işleyicisi için ayrı sınıf kitaplığı (dll) projesi oluşturmak için

  1. Yeni bir Visual Studio çözümü veya varolan bir çözüm içerisinde bir Sınıf Kitaplığı projesi oluşturun.

    1. Üzerinde Dosya menüsünden seçin Yeni, Proje.

    2. Altında Yüklü Şablonlar, genişletme Visual C# veya Visual Basic, ardından Orta sütundaki seçin Class Library.

  2. Aşağıdaki başvuruları projenize ekleyin.

    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 – Yalnızca Katman diyagramlarını genişletirken buna ihtiyacınız vardır.Daha fazla bilgi için bkz. Katman diyagramları genişletme.

  3. Sınıf kitaplığı projesine bir sınıf dosyası ekleyin ve içeriğini aşağıdaki koda göre ayarlayın.

    [!NOT]

    Ad alanını ve sınıf adını tercihinize göre değiştirin.

    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;
              }
            });
        }
    
      }
    }
    

    Yöntemlere konulacaklar hakkında daha fazla bilgi için bkz. Jest İşleyici Uygulama.

Menü komutunuzu, komutu yüklemek için bir kapsayıcı görevi gören bir VSIX projesine eklemeniz gerekir.İsterseniz, aynı VSIX içine diğer bileşenleri dahil edebilirsiniz.

Bir VSIX projesine ayrı bir hareket işleyici eklemek için

  1. Hareket işleyicisi ile kendi VSIX oluşturduysanız, bu yordama ihtiyacınız yoktur.

  2. Çözümünüz zaten içermiyorsa, bir VSIX projesi oluşturun.

    1. İçinde Çözüm Gezgini, çözümün kısayol menüsünden seçin Ekle, Yeni bir proje.

    2. Altında Yüklü Şablonlar, genişletme Visual C# veya Visual Basic, sonra genişletilebilirlik.Orta sütundaki seçin VSIX proje.

  3. Çözümün başlangıç projesi olarak VSIX projesini ayarlayın.

    • Çözüm Gezgini'nde VSIX projesinin kısayol menüsünde seçin başlangıç projesi olarak ayarla.
  4. İçinde source.extension.vsixmanifest, bir mef bileşeni olarak hareket işleyicisi sınıf kitaplığı projesini ekleyin:

    1. Üzerinde meta veri sekmesinde, VSIX adını ayarlayın.

    2. Üzerinde Yükleme hedefleri sekmesinde, Visual Studio Ultimate ve Premium hedefleri ayarlayın.

    3. Üzerinde varlıklarını sekmesinde, seçim bir Yenive iletişim kutusunda ayarlayın:

      Türü = mef bileşeni

      Kaynak = Geçerli çözümde bir proje

      Proje = sınıf kitaplığı projenizin

Hareket İşlecini Yürütme

Test amaçları için hareket işleyicinizi hata ayıklama modunda yürütün.

Hareket işleyicisini test etmek için

  1. F5'e basın ya da Hata Ayıklama menüsünde Hata Ayıklamayı Başlat'ı tıklatın.

    Visual Studio deneysel örneği başlar.

    Sorun giderme: Yeni bir Visual Studio başlamazsa:

    • Birden fazla projeniz varsa, VSIX projesinin çözümün Başlangıç projesi olarak ayarlandığından emin olun.

    • Çözüm Gezgini'nde başlatma veya yalnızca projeyi, kısayol menüsünde Özellikler'i seçin.Proje Özellikleri düzenleyicisinden seçin hata ayıklama sekme.Harici program başlat alanındaki dizenin tipik olarak Visual Studio öğesinin tam yol adı olduğunu doğrulayın:

      C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe

  2. Deneysel Visual Studio üzerinde bir modelleme projesi oluşturun veya açın ve bir modelleme diyagramı oluşturun veya açın.Hareket işleyici sınıfınızın özniteliklerinde listelenen türlerden birine ait bir diyagram kullanın.

  3. Diyagram üzerinde herhangi bir yeri çift tıklatın.Çift tıklatma işleyiciniz çağrılmalıdır.

  4. UML Tarayıcısının bir öğesini diyagram üzerine sürükleyin.Sürükleme işleyiciniz çağrılmalıdır.

Sorun giderme: Hareket işleyicisi çalışmıyorsa, şundan emin olun:

  • Hareketi işleyicisi proje bir mef bileşeni olarak listelenir varlıklarını sekmesinde source.extensions.manifest VSIX projesindeki.

  • Tüm Import ve Export özniteliklerinin parametreleri geçerlidir.

  • CanDragDrop yöntemi false döndürmez.

  • Kullandığınız model diyagramın türü (UML sınıfı, dizisi ve buna benzer) menü komut sınıfı özniteliklerinden biri olarak listelenir: [ClassDesignerExtension], [SequenceDesignerExtension] ve buna benzer.

  • Bu tür hedef ve bırakılan öğe için önceden tanımlanan, bırakılan hiçbir işlevsellik mevcut değil.

Jest İşleyici'yi Uygulama

Ee534033.collapse_all(tr-tr,VS.110).gifHareket İşleyici Yöntemleri

Hareket işleyicisi sınıfı IGestureExtension öğesini uygular ve dışarı aktarır.Tanımlamanız gereken yöntemler aşağıdaki gibidir:

bool CanDragDrop (ShapeElement target, DiagramDragEventArgs dragEvent)

Bu hedefte bırakılacak dragEvent'te başvurulmuş kaynak öğeye izin vermek için true döner.

Bu yöntemin modelde değişiklikler yapmaması gerekir.Kullanıcı fareyi hareket ettirdikçe okun durumunu belirlemek için kullanıldığından, hızlı çalışması gerekir.

void OnDragDrop (ShapeElement target, DiagramDragEventArgs dragEvent)

dragEvent ve hedefte başvurulmuş kaynak nesnesine dayalı modeli güncelleştirin.

Kullanıcının fareyi sürükleyip ardından bıraktığında çağrıldı.

void OnDoubleClick (ShapeElement target, DiagramPointEventArgs pointEvent)

target kullanıcının çift tıklattığı şekildir.

Sadece UML'i değil dosya, .NET sınıf görünümündeki düğümler, Mimari Gezgini düğümleri vb.leri gibi çeşitli öğeleri de kabul edebilen işleyiciler yazabilirsiniz.Kullanıcı, bu öğelerden herhangi birini UML diyagram üzerine sürükleyebilirsiniz, bu öğelerin seri hale getirilmiş biçimlerini çözebilen OnDragDrop yöntemi yazmanızı sağlar.Çözümleme yöntemleri bir öğe türünden diğerine farklılık gösterir.

Bu yöntemlerin parametreleri şunlardır:

  • ShapeElement target.Kullanıcının üzerine birşey sürüklediği şekil veya diyagram.

    ShapeElement, UML modelleme araçlarının altını çizen uygulamadaki bir sınıftır.UML model ve diyagramlarını tutarlı bir duruma koymanın riskini azaltmak için, bu sınıfın yöntemlerini doğrudan kullanmamanızı öneririz.Bunun yerine, öğeyi IShape içine sarmalayın ve sonra Bir Model, Diyagramlar Üzerinde Nasıl Görüntülenir'da açıklanmış yöntemleri kullanın.

    • IShape edinmek için:

      IShape targetIShape = target.CreateIShape(target);
      
    • Sürükleme veya çift tıklama işlemleri tarafından hedeflenen bir model öğesi elde etmek için:

      IElement target = targetIShape.Element;
      

      Bunu daha belirli bir öğe türüne çevirebilirsiniz.

    • UML modeli içeren bir UML model deposu elde etmek için:

      IModelStore modelStore = 
        targetIShape.Element.GetModelStore(); 
      
    • Ana bilgisayar ve hizmet sağlayıcısına erişim edinmek için:

      target.Store.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE
      
  • DiagramDragEventArgs eventArgs.Bu parametre, sürükleme işleminin kaynak nesnesinin seri hala getirilmiş biçimini taşır:

    System.Windows.Forms.IDataObject data = eventArgs.Data;  
    

    Birçok farklı türdeki öğeleri, Visual Studio'nun farklı parçalarından veya Windows masaüstünden bir diyagram üzerine sürükleyebilirsiniz.Öğenin farklı türleri, IDataObject içinde farklı yollarda kodlanır.Öğeleri buradan ayıklamak için, nesnenin uygun türü için belgeye başvurun.

    Eğer kaynak nesneniz, UML Model Gezgini'nden veya başka bir UML diyagramından sürüklenen bir UML öğesi ise, Nasıl yapılır: UML Model Öğelerini IDataObject'den Alma'e başvurun.

Ee534033.collapse_all(tr-tr,VS.110).gifYöntemlerin kodunu yazma

Modeli okumak ve güncellemek amacıyla kod yazma hakkında daha fazla bilgi için bkz. UML API ile Programlama.

Bir sürükleme işleminde model bilgisine erişmek hakkında daha fazla bilgi edinmek için bkz. Nasıl yapılır: UML Model Öğelerini IDataObject'den Alma.

Sıra diyagram ile uğraşıyorsanız, ayrıca bkz. UML API Kullanarak Sıralama Diyagramları Nasıl Düzenlenir.

Yöntemlerin parametrelerine ek olarak, geçerli diyagrama ve modele erişimi sağlayan içeri aktarılan bir özelliği de sınıfınızda tanımlayabilirsiniz.

[Import] public IDiagramContext DiagramContext { get; set; }

IDiagramContext'in bildirimi diyagrama, geçerli seçime ve modele erişen yöntemlerinizde kod yazmanıza olanak sağlar.

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>) {...}

Daha fazla bilgi için bkz. UML Modeli Nasıl Gezilir.

Bir uzantıyı yükleme ve kaldırma

Visual Studio'yu hem kendi bilgisayarınıza hem de diğer bilgisayarlara yükleyebilirsiniz.

Bir uzantı yüklemek için

  1. Bilgisayarınızda, VSIX projeniz tarafından oluşturulmuş .vsix dosyasını bulun.

    1. İçinde Çözüm Gezgini, VSIX projesine kısayol menüsünden seçin Klasörü Windows Gezgini'nde Aç.

    2. bin\*\Projeniz.vsix dosyasını bulun.

  2. Uzantıyı yüklemek istediğiniz hedef bilgisayara .vsix dosyasını kopyalayın.Bu sizin kendi bilgisayarınız veya başka bir tane olabilir.

    Hedef bilgisayarda source.extension.vsixmanifest'te belirttiğiniz Visual Studio'nun sürümlerinden biri olmalıdır.

  3. Hedef bilgisayarda açmak .vsix dosyası.

    Visual Studio Uzantı Yükleyicisi uzantıyı açar ve yükler.

  4. Visual Studio'yu başlatın veya yeniden başlatın.

Bir uzantıyı kaldırmak için

  1. Üzerinde araçları menüsünden seçin Uzantı Yöneticisi.

  2. Yüklü Uzantıları genişletin.

  3. Uzantıyı seçin ve sonra seçin kaldırma.

Nadiren, hatalı bir uzantı yüklemede başarısız olur ve hata penceresinde bir rapor oluşturur, ancak Uzantı Yöneticisi'nde görünmez.Bu durumda, dosyayı şuradan silerek uzantıyı kaldırabilirsiniz:

%LocalAppData%\Local\Microsoft\VisualStudio\11.0\Extensions

Örnek

Aşağıdaki örnek, sıralı diyagramda yaşam çizgilerinin nasıl oluştuğunu bileşen diyagramdan sürüklenen bileşenin parça ve bağlantı noktalarına dayanarak gösterir.

Test etmek için F5 tuşuna basın.Visual Studio'nun deneysel örneği açılır.Bu örnekte, bir UML model açın ve bileşen diyagramı üzerinde bir bileşen oluşturun.Bu bileşeni bazı arayüzlere ve iç bileşen parçalarına ekleyin.Arabirimleri ve bölümleri seçin.Sonra arabirimleri ve parçaları bir sıralama diyagramına sürükleyin.(Sıra diyagramı için bileşen diyagramından sekmeye kadar ve ardından aşağıdaki sıra diyagramının içine sürükleyin.) Her arabirim ve parça için bir hayat çizgisi görünecektir.

Sıralı diyagramlara bağlama etkileşimleri hakkında daha fazla bilgi için bkz. UML API Kullanarak Sıralama Diyagramları Nasıl Düzenlenir.

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)
  {
  }
}

GetModelElementsFromDragEvent() kodu, Nasıl yapılır: UML Model Öğelerini IDataObject'den Alma tanımlanmıştır.

Ayrıca bkz.

Kavramlar

Nasıl yapılır: Bir Modelleme Uzantısı Tanımlama ve Yükleme

UML Modellerini ve Diyagramları Genişletme

Nasıl yapılır: Modelleme Diyagramında Menü Komutu Tanımlama

UML Modelleri için Doğrulama Kısıtlamaları Nasıl Tanımlanır

UML API ile Programlama