Aracılığıyla paylaş


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

Visual Studio Ultimate öğesinde kullanıcı bir UML diyagramını sağ tıklattığında görünen ek menü öğelerini tanımlayabilirsiniz. Menü komutunun görüntülenip görüntülenmeyeceğini ve kullanıcı diyagram üzerindeki herhangi bir öğeyi sağ tıklattığında etkinleştirilip etkinleştirilmeyeceğini denetleyebilir ve kullanıcı menü öğesi seçtiğinde çalışan bir kod yazabilirsiniz. Bu uzantıları Visual Studio Tümleştirme Uzantısı (VSIX) olarak paketleyebilir ve bu uzantıyı diğer Visual Studio Ultimate kullanıcılarına dağıtabilirsiniz.

Gereksinimler

Menü komutunu uygulama

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

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

  • Ayrı menü komutu 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, menü komutunuz 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 menü komutu oluşturmak için

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

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

    Daha fazla bilgi için bkz. Menü Komutunu Uygulama.

  3. Yeni sınıflar tanımlayarak bu projeye ek komutlar ekleyebilirsiniz.

  4. F5'e basarak menü komutunu test edin. Daha fazla bilgi için bkz. Menü Komutunu Yürütme.

  5. Menü komutunu projeniz tarafından oluşturulan bin\*\*.vsix dosyasını kopyalayarak başka bir bilgisayara yükleyin. Daha fazla bilgi için bkz. Menü Komutunu Yükleme.

Bir sınıf kitaplığı (DLL) projesinde ayrı bir menü komutu 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. Dosya menüsünde, Yeni'nin üzerine gelin ve Proje'yi tıklayın.

    2. Yüklü Şablonlar altında Visual C# veya Visual Basic'i tıklatın. Orta sütundaki Sınıf Kitaplığı'nı tıklatın.

    3. Yeni bir çözüm oluşturmak veya önceden açmış olduğunuz VSIX çözümüne bir bileşen eklemek isteyip istemediğinizi belirtmek için Çözüm'ü ayarlayın.

    4. Proje Adını ve Konumunu ayarlayıp Tamam'ı tıklatın.

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

    Başvuru

    Ne yapmanıza izin verir

    System.ComponentModel.Composition

    Yönetilen Genişletilebilirlik Çerçevesi (MEF) paketini kullanarak bileşenleri tanımlayın.

    Microsoft.VisualStudio.Uml.Interfaces

    Model öğelerin özelliklerini okuyun ve değiştirin.

    Microsoft.VisualStudio.ArchitectureTools.Extensibility

    Model öğeleri oluşturun, diyagramdaki şekilleri değiştirin.

    Microsoft.VisualStudio.Modeling.Sdk.10.0

    Model öğe işleyicilerini tanımlar.

    Modeldeki değişiklikler dizisini kapsüller. Daha fazla bilgi için bkz. Nasıl yapılır: İşlemleri kullanarak Model Güncelleştirmelerini Bağlama.

    Microsoft.VisualStudio.Modeling.Sdk.Diagrams.10.0

    (her zaman gerekli değil)

    Hareket işleyicileri için ek diyagram öğelerine erişir.

    Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer

    Yalnızca katman diyagramlarındaki komutlar için gerekir. Daha fazla bilgi için bkz. Creating extensions for Layer diagrams.

    Katman diyagramları üzerinde komutlar tanımlayın.

  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ı, sınıf adını ve Text tarafından döndürülen değeri tercihinize göre değiştirin.

    using System.ComponentModel.Composition;   
    using System.Linq;
    using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
    using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
    using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
    using Microsoft.VisualStudio.Uml.AuxiliaryConstructs;
    using Microsoft.VisualStudio.Uml.Classes; 
        // ADD other UML namespaces if required
    
    namespace UMLmenu1 // CHANGE
    {
      // DELETE any of these attributes if the command
      // should not appear in some types of diagram.
      [ClassDesignerExtension]
      [ActivityDesignerExtension]
      [ComponentDesignerExtension]
      [SequenceDesignerExtension]
      [UseCaseDesignerExtension]
      // [LayerDesignerExtension] // if you have installed Feature Pack 1
    
      // All menu commands must export ICommandExtension:
      [Export (typeof(ICommandExtension))]
      // CHANGE class name
      public class Menu1 : ICommandExtension
      {
        [Import]
        public IDiagramContext DiagramContext { get; set; }
    
        public void QueryStatus(IMenuCommand command)
        { // Set command.Visible or command.Enabled to false
          // to disable the menu command.
          command.Visible = command.Enabled = true;
        }
    
        public string Text
        {
          get { return "MENU COMMAND LABEL"; }
        }
    
        public void Execute(IMenuCommand command)
        {
          // A selection of starting points:
          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 (IElement element in modelStore.AllInstances<IClass>()) 
          { }
        }
      }
    }
    

    Yöntemlere konulacaklar hakkında daha fazla bilgi için bkz. Menü Komutu 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 menü komutu eklemek için

  1. Kendi VSIX'i olan bir menü komutu oluşturduysanız, bu yordama ihtiyacınız yoktur.

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

    1. Çözüm Gezgini'nde çözümü sağ tıklatın, Ekle'nin üzerine gelin ve sonra Yeni Proje'yi tıklatın.

    2. Yüklü Şablonlar altından Visual C# veya Visual Basic'i genişletin ardından Genişletilebilirlik'i tıklatın. Orta sütundaki VSIX Projesi'ni tıklatın.

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

    Çözüm Gezgini'nde VSIX projesini sağ tıklatın ve sonra Başlangıç Projesi Olarak Ayarla'yı tıklatın.

  4. source.extension.vsixmanifest öğesinde, İçerik'in altında, sınıf kitaplığı projesini MEF Bileşeni olarak ekleyin.

    1. source.extension.vsixmanifest öğesini açın.

    2. İçerik Ekle'ye tıklayın.

    3. Bir içerik türü seçin seçeneğinden MEF Bileşeni'ni seçin.

    4. Bir kaynak seçin seçeneğinde Proje'yi tıklatın ve sınıf kitaplığı projenizin adını seçin.

  5. Sürümleri Seçin'i tıklatın ve uzantınızı çalıştırmak istediğiniz Visual Studio sürümleri seçin.

  6. VSIX'in adını ve açıklayıcı alanlarını ayarlayın. Dosyayı kaydedin.

Menü Komutunu Uygulama

Menü komutu sınıfı ICommandExtension için gerekli yöntemleri uygular.

string Text { get; }

Menü öğenizin etiketini döndürün.

void QueryStatus(IMenuCommand command);

Kullanıcı diyagramda sağ tıkladığı zaman çağrılır.

Bu yöntemin modeli değiştirmemesi gerekir.

Komutun görünür ve etkin olmasını isteyip istemediğinize karar vermek için DiagramContext.CurrentDiagram.SelectedShapes kullanın.

Ayarlayın:

  • Eğer komut, kullanıcı diyagramda sağ tıkladığı zaman menüde görünmeliyse command.Visible'ı true'ya ayarlayın

  • Eğer kullanıcı, menüde komuta tıklayabiliyorsa command.Enabled'ı true'ya ayarlayın

  • Menü etiketini dinamik olarak belirlemek için command.Text'i ayarlayın

void Execute (IMenuCommand command);

Eğer o görünür ve etkin ise kullanıcı menü öğesine tıkladığı zaman çağrılır.

 

Kod İçinde Modele Erişme

Menü komut sınıfına aşağıdaki bildirimi dahil edin:

[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 (IElement element in modelStore.AllInstances<IUseCase>()) {...}

Modeli Gezinme ve Güncelleştirme

UML modeli öğeleri API aracılığıyla tümü kullanılabilirdir. Geçerli seçimden veya modelin kökünden diğer tüm öğelere erişebilirsiniz. Daha fazla bilgi için bkz. UML Modeli Nasıl Gezilir ve UML API ile Programlama.

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

Ayrıca API; öğelerin özelliklerini değiştirmenizi, öğeleri ve ilişkileri silmenizi, ve yeni öğeler ve ilişkiler oluşturmanızı sağlar.

Varsayılan olarak, Yürütme yönteminde yaptığınız her değişiklik ayrı bir işlemde gerçekleştirilecektir. Kullanıcı, her değişikliği ayrı ayrı geri alabilecektir. Eğer değişiklikleri tek bir işlemde gruplandırmak istiyorsanız Nasıl yapılır: İşlemleri kullanarak Model Güncelleştirmelerini Bağlama'ta açıklandığı gibi ILinkedUndoTransaction'ı kullanın.

Güncelleştirmeler için UI İş Parçacığını Kullanma

Bazı durumlarda modele güncelleştirmeyi arka plan iş parçacığından yapmak kullanışlı olabilir. Örneğin, komutunuz bir yavaş kaynaktan veri yüklerse, kullanıcının değişiklikleri gerçekleşme aşamasında görüntüleyebilmesi için yükleme işlemini ir arka plan iş parçacığı üzerinde gerçekleştirebilir ve gerekirse işlemi sonlandırabilirsiniz.

Ancak, model depolamasının bir iş parçacığı kasası olmadığını bilmelisiniz. Güncelleştirmeler yapmak için her zaman kullanıcı ara birimi (UI) iş parçacığını kullanmanız ve mümkünse arka plan işlemi devem ederken kullanıcıların düzenlemeler yapmasını engellemeniz gerekir. Bir örnek için bkz. Arka Plan İş Parçacığı'ndan bir UML Modeli Nasıl Güncelleştirilir.

Menü Komutunu Yürütme

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

Menü komutunu 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 sağ tıklatın ve sonra Özellikler'i tıklatın. Proje özellikleri düzenleyicisinden Hata Ayıklama sekmesini tıklatın. 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 10.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. Menü komutu sınıfınızın özniteliklerinde listelenen türlerden birine ait bir diyagram kullanın.

  3. Diyagram üzerinde herhangi bir yeri sağ tıklayın. Komutunuz menüde görünmeli.

    Sorun giderme: Komut menüde görünmüyorsa, şundan emin olun:

    • Menü komutu projesi, VSIX projesindeki source.extensions.manifest öğesindeki İçerik listesinde bir MEF bileşeni olarak listelenir.

    • Import ve Export özniteliklerinin parametreleri geçerlidir.

    • QueryStatus yöntemi command.Enabled veya Visible alanlarını falseöğesine ayarlamıyor.

    • 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.

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. Çözüm Gezgini'nde, VSIX projesine sağ tıklatın ve sonra Windows Gezgini'nde Klasör Aç'ı tıklatın.

    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, .vsix dosyasına çift tıklayın.

    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. Araçlar menüsünde, Uzantı Yöneticisi'ne tıklayın.

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

  3. Uzantıyı seçin ve sonra Kaldır'a tıklayın.

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\10.0\Extensions

Örnek

Aşağıdaki örnek, sınıf diyagramı üzerindeki iki öğenin adlarını değiştirecek menü komutu için kod gösterir. Bu kod, Visual Studio Uzantı projesine yerleştirilmeli ve önceki bölümlerde açıklandığı gibi yüklenmelidir.

using System.Collections.Generic; // for IEnumerable
using System.ComponentModel.Composition;
  // for [Import], [Export]
using System.Linq; // for IEnumerable extensions
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
  // for IDiagramContext
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
  // for designer extension attributes
using Microsoft.VisualStudio.Modeling.Diagrams;
  // for ShapeElement
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
  // for IGestureExtension, ICommandExtension, ILinkedUndoContext
using Microsoft.VisualStudio.Uml.Classes;
  // for class diagrams, packages

/// <summary>
/// Extension to swap names of classes in a class diagram.
/// </summary>
namespace SwapClassNames
{
  // Declare the class as an MEF component:
  [Export(typeof(ICommandExtension))]
  [ClassDesignerExtension]
  // Add more ExportMetadata attributes to make
  // the command appear on diagrams of other types.
  public class NameSwapper : ICommandExtension
  {
  // MEF required interfaces:
  [Import]
  public IDiagramContext Context { get; set; }
  [Import]
  public ILinkedUndoContext LinkedUndoContext { get; set; }

  /// <summary>
  /// Swap the names of the currently selected elements.
  /// </summary>
  /// <param name="command"></param>
  public void Execute(IMenuCommand command)
  {
    // Get selected shapes that are IClassifiers -
    // IClasses, IInterfaces, IEnumerators.
    var selectedShapes = Context.CurrentDiagram
     .GetSelectedShapes<IClassifier>();
    if (selectedShapes.Count() < 2) return;

    // Get model elements displayed by shapes.
    IClassifier firstElement = selectedShapes.First().Element;
    IClassifier lastElement = selectedShapes.Last().Element;

    // Do the swap in a transaction so that user
    // cannot undo one change without the other.
    using (ILinkedUndoTransaction transaction =
    LinkedUndoContext.BeginTransaction("Swap names"))
    {
    string firstName = firstElement.Name;
    firstElement.Name = lastElement.Name;
    lastElement.Name = firstName;
    transaction.Commit();
    }
  }

  /// <summary>
  /// Called by Visual Studio to determine whether
  /// menu item should be visible and enabled.
  /// </summary>
  public void QueryStatus(IMenuCommand command)
  { 
    int selectedClassifiers = Context.CurrentDiagram
     .GetSelectedShapes<IClassifier>().Count();
    command.Visible = selectedClassifiers > 0;
    command.Enabled = selectedClassifiers == 2;
  }

  /// <summary>
  /// Name of the menu command.
  /// </summary>
  public string Text
  {
    get { return "Swap Names"; }
  }
  }

}

Ayrıca bkz.

Kavramlar

UML Modellerini ve Diyagramları Genişletme

Nasıl yapılır: Özel Modelleme Araç Kutusu Öğesi Tanımlama

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

UML API ile Programlama

Diğer Kaynaklar

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

Modelleme Diyagramı'nda Düşürme ve Çift Tıklatma İşleyicisi Nasıl Tanımlanır

UML API Kullanarak Sıralama Diyagramları Nasıl Düzenlenir