Aracılığıyla paylaş


Nasıl yapılır: kısayol menüsüne komut ekleme

Böylece kullanıcılarınız dsl belirli görevleri gerçekleştirebilir, etki alanına özgü dil (dsl) menü komutları ekleyebilirsiniz.Kullanıcılar Diyagram üzerinde sağ tıklattığınızda komutlar (kısayol) bağlam menüsünde görünür.Bir komutu yalnızca belirli durumlarda menüsünde görünecek şekilde tanımlayabilirsiniz.Yalnızca belirli türdeki öğeyi veya öğeleri belirli durumlar içinde kullanıcı tıklattığında gibi komut görünür yapabilirsiniz.

Özetle, aşağıdaki gibi DslPackage projede adımlar gerçekleştirilir:

  1. Commands.vsct komutunda bildirmek

  2. Güncelleştirme paketi sürüm numarası Package.tt,.Commands.vsct değiştiğinde bunu yapmak zorunda

  3. CommandSet sınıfında yöntemler yazmak komutu görünür hale getirmek için ve komut yapmak istediğinizi tanımlamak için.

Örnekler için bkz: görselleştirme ve modelleme sdk Web sitesi.

[!NOT]

CommandSet.cs yöntemleri geçersiz kılarak, Kes, Yapıştır, Tümünü Seç ve yazdırma gibi varolan bazı komutlar davranışını da değiştirebilirsiniz.Daha fazla bilgi için bkz. Nasıl yapılır: bir etki alanına özgü dilde standart bir menü komutu değiştirmek.

mef kullanarak komut tanımlama

Yönetilen uzantısı Framework (mef) Diyagram menüsünde menü komutlarını tanımlamak için alternatif bir yöntem sağlar.Birincil amacı, sizin tarafınızdan veya diğer kuruluşlar tarafından genişletilmesi dsl getirmektir.Kullanıcılar yalnızca dsl yüklemeyi seçebilirsiniz veya dsl ve uzantıları yükleyebilirsiniz.Ancak, mef mef dsl üzerinde etkinleştirmek için ilk iş sonra kısayol menü komutlarını tanımlayan işini de azaltır.

Bu konuda, yöntemi kullanın:

  1. Sağ kısayol menüsü dışında menülerdeki menü komutlarını tanımlamak istiyor.

  2. Menüde komutlar belirli gruplamaları tanımlamak istiyor.

  3. Başkalarının kendi komutlarla dsl genişletmek etkinleştirmek istiyor musunuz.

  4. Yalnızca tek bir komutta tanımlamak istiyor.

Aksi takdirde komutlarını tanımlamak için mef yöntemini kullanmayı düşünün.Daha fazla bilgi için bkz. mef kullanarak dsl genişletin.

Commands.Vsct komutunda bildirmek

Menü komutlarını DslPackage\Commands.vsct bildirilir.Bu tanımları menü öğelerinin ve menülerdeki göründüğü etiketleri belirtin.

Tanımları, düzenleme, dosya, Commands.vsct dizininde bulunan birkaç .h dosyaları alır Visual Studio sdk yükleme yolu\VisualStudioIntegration\Common\Inc.Ayrıca, kendi dsl tanımından üretilen GeneratedVsct.vsct içerir.

.Vsct dosyaları hakkında daha fazla bilgi için bkz: Visual Studio komut tablosu (.Vsct) dosyaları.

Komut eklemek için

  1. İçinde Solution Explorer, altında DslPackage proje, Commands.vsct açın.

  2. De Commands öğesi, bir veya daha fazla düğme ve bir grup tanımlayın.A düğmesini menüsünden bir maddedir.A Grup menü bölümünde bulunur.Bu öğeleri tanımlamak için aşağıdaki öğeleri ekleyin:

    <!-- Define a group - a section in the menu -->
    <Groups>
      <Group guid="guidCustomMenuCmdSet" id="grpidMyMenuGroup" priority="0x0100">
        <!-- These symbols are defined in GeneratedVSCT.vsct -->
        <Parent guid="guidCmdSet" id="menuidContext" />
      </Group>
    </Groups>
    <!-- Define a button - a menu item - inside the Group -->
    <Buttons>
      <Button guid="guidCustomMenuCmdSet" id="cmdidMyContextMenuCommand"
        priority="0x0100" type="Button">
        <Parent guid="guidCustomMenuCmdSet" id="grpidMyMenuGroup"/>
        <!-- If you do not want to place the command in your own Group, 
             use Parent guid="guidCmdSet" id="grpidContextMain".
             These symbols are defined in GeneratedVSCT.vsct -->
        <CommandFlag>DynamicVisibility</CommandFlag>
        <Strings>
          <ButtonText>My Context Menu Command</ButtonText>
        </Strings>
      </Button>
    </Buttons>
    

    [!NOT]

    Her düğme veya grup bir GUID ile bir tamsayı kimliği tarafından tanımlanırAynı GUID ile çeşitli gruplar ve düğmeler oluşturabilirsiniz.Ancak, farklı bir kimliği olması gerekir.GUID ve ID adlarını gerçek GUID ve sayısal kimlikler de çevrilen <Symbols> düğüm.

  3. Görünürlük kısıtlama komutu ekleyebilirsiniz, böylece yalnızca kendi etki alanına özgü dil bağlamında yüklenir.Daha fazla bilgi için bkz. VisibilityConstraints öğesi.

    Bunu yapmak için aşağıdaki öğeler ekleme CommandTable öğesinden sonra Commands öğesi.

    <VisibilityConstraints>
      <!-- Ensures the command is only loaded for this DSL -->
      <VisibilityItem guid="guidCustomMenuCmdSet" id="cmdidMyContextMenuCommand"
        context="guidEditor"/>
    </VisibilityConstraints>
    
  4. GUID ve kimlikleri için kullanılan adları tanımlayın.Bunu yapmak için ekleme bir Symbols öğesinde CommandTable öğesinden sonra Commands öğesi.

    <Symbols>
      <!-- Substitute a unique GUID for the placeholder: -->
      <GuidSymbol name="guidCustomMenuCmdSet"
        value="{00000000-0000-0000-0000-000000000000}" >
        <IDSymbol name="grpidMyMenuGroup" value="0x01001"/>
        <IDSymbol name="cmdidMyContextMenuCommand" value="0x00001"/>
      </GuidSymbol>
    </Symbols>
    
  5. Yerine {000...000} grupları ve menü öğeleri tanımlayan bir GUID.Yeni bir GUID elde etmek için Create GUID aracı açıkken araçları menü.

    [!NOT]

    Daha fazla grup veya menü öğelerini eklerseniz, aynı GUID kullanabilirsiniz.Yeni değerleri kullanmanız gerekir ancak, IDSymbols.

  6. Bu yordamdan kopyaladığınız kodu, kendi dizeleriyle geçtiği aşağıdaki dizelerden birini değiştirin:

    • grpidMyMenuGroup

    • cmdidMyContextMenuCommand

    • guidCustomMenuCmdSet

    • Belgelerim bağlam menü komutu

Güncelleştirme paketi sürüm Package.tt

Eklemek veya bir komutu değiştirmek olduğunda güncelleştirmesini version parametresi ProvideMenuResourceAttribute , uygulandığı paketinin sınıfına etki alanına özgü dilinizi yeni sürümü bırakmadan önce.

Paket sınıfı oluşturulmuş bir dosya olarak tanımlanır çünkü Package.cs dosyası oluşturur metin şablon dosyasında öznitelik güncelleştirin.

Package.tt dosyasını güncelleştirmek için

  1. İçinde Solution Explorer, DslPackage de, proje GeneratedCode klasöründe Package.tt dosyasını açın.

  2. Bulun ProvideMenuResource özniteliği.

  3. Artış version ikinci parametre öznitelik parametresi.İsterseniz, kendi amacını açıkça size anımsatmak için parametre adı yazabilirsiniz.Örne?in:

    [VSShell::ProvideMenuResource("1000.ctmenu", version: 2 )]

Komutu davranışını tanımlamak

dsl DslPackage\GeneratedCode\CommandSet.cs içinde bildirilen kısmi bir sınıfta uygulanan bazı komutlar zaten var.Yeni komutları eklemek için aynı sınıfın bir kısmi bildirimi içeren yeni bir dosya oluşturarak bu sınıf genişletmeniz gerekir.Sınıfın adı genellikle olan <YourDslName>CommandSet.Sınıfın adını doğrulamak ve içeriğini inceleyerek başlamak yararlıdır.

Komut kümesi sınıf türetilir CommandSet.

CommandSet sınıf genişletmek için

  1. Solution Explorer'da, DslPackage proje GeneratedCode klasörünü açın ve CommandSet.tt altında arayın ve CommandSet.cs ile oluşturulan dosya açın.Ad ve orada tanımlanan birinci sınıf adını not alın.Örneğin, görebilirsiniz:

    namespace Company.Language1

    { ... internal partial class Language1CommandSet : ...

  2. De DslPackage, özel kod adlı bir klasör oluşturun.Bu klasörde adlı yeni bir sınıf dosyası oluşturmak CommandSet.cs.

  3. Yeni dosyasında aynı ad alanına ve ada oluşturulmuş kısmi sınıfı olan bir kısmi bildirimi yazın.Örne?in:

    namespace Company.Language1 /* Make sure this is correct */

    { internal partial class Language1CommandSet { ...

    Not sınıf şablonu yeni dosyayı oluşturmak için kullanılan, hem ad hem de sınıf adı düzeltmeniz gerekir.

Dd820681.collapse_all(tr-tr,VS.110).gifSet komutunu sınıfını genişletir

Aşağıdaki ad alanları almak komut kümesinin kodu genellikle gerekir:

using System;
using System.Collections.Generic;
using System.ComponentModel.Design; 
using System.Linq;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
using Microsoft.VisualStudio.Modeling.Shell;

Ad ve sınıf adı içinde oluşturulan CommandSet.cs uyacak biçimde ayarlayın:

namespace Company.Language1 /* Make sure this is correct */
{
  // Same class as the generated class.
  internal partial class Language1CommandSet 
  {

Ne zaman komut bağlam menüsü ve komutu gerçekleştirmek için diğer üzerinde görünür olacağını belirlemek için iki yöntem tanımlamak zorunda.Bu yöntemleri geçersiz kılmaları değildir; Bunun yerine, bunları komutların listesini kaydedin.

Dd820681.collapse_all(tr-tr,VS.110).gifKomut ne zaman görünür olacağını tanımlayın

Her komut için tanımlayan bir OnStatus... komutunun menüde görüntülenmesini ve olup onu etkinleştirilecek veya nda belirleyen yöntemi.Set Visible ve Enabled özelliklerini MenuCommand, aşağıdaki örnekte gösterildiği gibi.Her zaman hızlı bir şekilde çalışması gerekir böylece kullanıcı Diyagramı sağ tıklattığında kısayol menüsü oluşturmak için bu yöntemi çağrılır.

Bu örnekte, komut yalnızca kullanıcının belirli bir şekil türü seçti ve yalnızca en az bir seçili öğeleri belirli bir durumda olduğunda etkinleştirilir görülebilir.Örnek sınıf diyagramı dsl şablona dayalı ve ClassShape ve ModelClass dsl içinde tanımlanan türleri şunlardır:

private void OnStatusMyContextMenuCommand(object sender, EventArgs e)
{
  MenuCommand command = sender as MenuCommand;
  command.Visible = command.Enabled = false;
  foreach (object selectedObject in this.CurrentSelection)
  {
    ClassShape shape = selectedObject as ClassShape;
    if (shape != null)
    {
      // Visibility depends on what is selected.
      command.Visible = true;
      ModelClass element = shape.ModelElement as ModelClass;
      // Enabled depends on state of selection.
      if (element != null && element.Comments.Count == 0)
      {
        command.Enabled = true;
        return; // seen enough
} } } }

Aşağıdaki parçaları OnStatus yöntemleri sık yararlıdır:

  • this.CurrentSelection.Kullanıcı sağ tıklattığınız şeklin her zaman bu listeye dahil edilir.Diyagram kullanıcı boş bir diyagram parçası üzerinde tıklarsa, liste tek üyesidir.

  • this.IsDiagramSelected() - trueKullanıcı boş bir diyagram parçası tıklattıysanız.

  • this.IsCurrentDiagramEmpty()

  • this.IsSingleSelection()-Kullanıcı birden çok nesne seçin.

  • this.SingleSelection-Şekil veya kullanıcı sağ tıklattığınız diyagramı

  • shape.ModelElement as MyLanguageElement-Şekil tarafından temsil edilen model öğesi.

Genel bir kılavuz olun Visible özelliği, neyin seçili olduğuna bağlıdır ve yapmak Enabled özelliği seçili öğeleri durumuna bağlıdır.

OnStatus yöntemi, depo durumunu değiştirmemeniz gerekir.

Dd820681.collapse_all(tr-tr,VS.110).gifKomut yaptığı tanımla

Her komut için tanımlayan bir OnMenu... yöntemi, kullanıcı menü komutunu tıkladığında gerekli eylemi gerçekleştirir.

Modeli öğeleri değişiklik yaparsanız, bir işlem içinde yapmalısınız.Daha fazla bilgi için bkz. Nasıl yapılır: bir etki alanına özgü dilde standart bir menü komutu değiştirmek.

Bu örnekte, ClassShape, ModelClass, ve Comment sınıf diyagramı dsl şablondan türetilen dsl tanımlanan türleridir.

private void OnMenuMyContextMenuCommand(object sender, EventArgs e)
{
  MenuCommand command = sender as MenuCommand;
  Store store = this.CurrentDocData.Store;
  // Changes to elements and shapes must be performed in a Transaction.
  using (Transaction transaction =
       store.TransactionManager.BeginTransaction("My command"))
  {
    foreach (object selectedObject in this.CurrentSelection)
    {
      // ClassShape is defined in my DSL.
      ClassShape shape = selectedObject as ClassShape;
      if (shape != null)
      {
        // ModelClass is defined in my DSL.
        ModelClass element = shape.ModelElement as ModelClass;
        if (element != null)
        {
          // Do required action here - for example:

          // Create a new element. Comment is defined in my DSL.
          Comment newComment = new Comment(element.Partition);
          // Every element must be the target of an embedding link.
          element.ModelRoot.Comments.Add(newComment);
          // Set properties of new element.
          newComment.Text = "This is a comment";
          // Create a reference link to existing object.
          element.Comments.Add(newComment);
        }
      }
    }
    transaction.Commit(); // Don't forget this!
  }
}

Nesne başka bir nesne modelinde gidin ve nesneler ve bağlantılar oluşturma hakkında daha fazla bilgi için bkz: Nasıl yapılır: bir etki alanına özgü dilde standart bir menü komutu değiştirmek.

Dd820681.collapse_all(tr-tr,VS.110).gifRegister komutu

C# [NULL]'ta CommandSet.vsct simgeler kısmında yapılan GUID ve ID değerleri ile ilgili bildirimler yineleyin:

    private Guid guidCustomMenuCmdSet = 
        new Guid("00000000-0000-0000-0000-000000000000");
    private const int grpidMyMenuGroup = 0x01001;
    private const int cmdidMyContextMenuCommand = 1;

İçinde eklenmiş gibi aynı GUID değerini kullanın Commands.vsct.

[!NOT]

vsct dosyasının simgeleri bölümünü değiştirirseniz, de bu bildirimleri eşleşecek şekilde değiştirmeniz gerekir.Sürüm numarası Package.tt, ayrıca artmalıdır

Bu komut kümesinin bir parçası, menü komutlarını kaydettirin.GetMenuCommands()ne zaman Diyagram başlatıldıktan sonra çağrılır:

protected override IList<MenuCommand> GetMenuCommands()
{
  // Get the list of generated commands.
  IList<MenuCommand> commands = base.GetMenuCommands();
  // Add a custom command:
  DynamicStatusMenuCommand myContextMenuCommand =
    new DynamicStatusMenuCommand(
      new EventHandler(OnStatusMyContextMenuCommand),
      new EventHandler(OnMenuMyContextMenuCommand),
      new CommandID(guidCustomMenuCmdSet, cmdidMyContextMenuCommand));
  commands.Add(myContextMenuCommand);
  // Add more commands here.
  return commands;
} 

Test et komutu

Oluşturma ve Visual Studio Deneysel bir örneğinde dsl çalıştırın.Komut, belirlemiş olduğunuz durumlarda kısayol menüsünde görünmesi gerekir.

Komut çalışma için

  1. Üzerinde Solution Explorer araç'ı Dönüştürme tüm şablonları.

  2. Press F5 çözümü yeniden oluþturun ve Deneysel yapı etki alanına özgü dilde hata ayıklama başlatmak için.

  3. Deneysel yapısında bir örnek diyagramı açarsınız.

  4. Diyagramdaki komutu doğru etkinleştirildiğini veya devre dışı bırakılmış ve uygun şekilde gösterilen veya gizli, seçili öğeye bağlı olduğunu doğrulamak için çeşitli öğeleri sağ tıklatın.

Sorun Giderme

Komutu menüde görüntülenmez:

  • Komutu, dsl paketi yükleyene kadar yalnızca Visual Studio Örnekleri debugging içinde görünür.Daha fazla bilgi için bkz. Etki alanına özgü dil çözümleri.

  • Deneysel sizin örnek bu dsl için doğru dosya adı uzantısına sahip olduğundan emin olun.Dosya adı uzantısı denetlemek için Visual Studio ana örneğinde DslDefinition.dsl açın.Sonra dsl Explorer'da Editor düğümünü sağ tıklatın ve sonra Özellikler'i tıklatın.Properties penceresinde DosyaUzantısı özelliğini inceleyin.

  • Yaptığınız artış paketi sürüm numarası?

  • OnStatus yönteminizi başında kesme noktası ayarlamak.Herhangi bir parçasını Diyagram üzerinde sağ tıklattığınızda bölmek.

    OnStatus yöntemi çağrılır değil:

    • GUID ve kimlikleri CommandSet kodunuzda olanlar Commands.vsct simgeler kısmında eşleştiğinden emin olun.

    • Commands.vsct GUID ve ID her üst düğümünde doğru üst grup tanımlamadığını denetleyin.

    • Dikkat Devenv / /rootsuffix exp Setup Visual Studio komut istemine yazın.Ardından Visual Studio hata ayıklama örneğini yeniden başlatın.

  • Bu komutu doğrulamak için OnStatus yöntemi adım.Görünür ve komut.Etkin ayarlanmış olan True.

Yanlış menü metni görünür veya komutu yanlış yerde görünüyor:

  • GUID ve ID birleşimi için bu komutu benzersiz olduğundan emin olun.

  • Paketinin önceki sürümlerini kaldırdığınızdan emin olun.

Ayrıca bkz.

Kavramlar

Nasıl yapılır: bir etki alanına özgü dilde standart bir menü komutu değiştirmek

Diğer Kaynaklar

Bir etki alanına özgü dil kişiselleştirmek için kod yazma

Örnek kod: devre diyagramları