Aracılığıyla paylaş


Kopyalama davranışını özelleştirme

İle oluşturulan bir etki alanına özgü dilde (dsl) Visual Studio görselleştirme ve modelleme sdk kullanıcının kopyalar ve öğeleri yapıştırır ne olacağını değiştirebilir.

Standart Kopyala ve Yapıştır davranışı

Kopyalama etkinleştirmek için Etkinleştirmek kopyala yapıştır özelliðinin Düzenleyen dsl Explorer düğüm.

Varsayılan olarak, kullanıcı öğeleri Pano'ya kopyalar, aşağıdaki öğeleri de kopyalanır:

  • Seçili öğeleri katıştırılmış altlarý.(Diğer bir deyişle, adresindeki kaynaklanan ilişkileri katıştırma hedefleri olan öğeler öğeleri kopyalanır.)

  • Kopyalanan öğeleri arasındaki ilişki bağlantılar.

Bu kural, kopyalanan öğeleri ve bağlantılar için yinelemeli olarak uygulanır.

Kopyalanan ve yapıştırılan öğe

Kopyalanan öğelerin bağlantıları seri hale getirilmiş ve saklanan bir ElementGroupPrototype (egp), Pano'ya yerleştirilir.

Kopyalanan öğelerin görüntüsünü de Pano'ya yerleştirilir.Böylece, Word gibi diğer uygulamalara yapıştırmak kullanıcı.

Kullanıcının öğeleri dsl tanımını kabul edebileceği bir hedef üzerine kopyalanan öğeleri yapıştırabilirsiniz.Örneğin, bileşenleri çözüm şablonundan oluşturulan bir dsl kullanıcı bağlantı bileşenleri üzerine ancak değil Diyagram üzerine yapıştırabilirsiniz; ve bileşenleri Diyagram üzerine, ancak diğer bileşenleri üzerine değil yapıştırabilirsiniz.

Kopyala ve Yapıştır davranışı özelleştirme

Program kodunu kullanarak modeli özelleştirme hakkında daha fazla bilgi için bkz: Gezinme ve Program kodunda bir modeli güncelleştiriliyor.

  • Etkinleştirmek veya devre dışı Kopyala, Kes ve Yapıştır.
    dsl Explorer'da ayarlı Etkinleştirmek kopyala yapıştır özelliðinin Düzenleyen düğüm.

  • Bağlantılar, aynı hedefe kopyalayın. Örneğin, kopyalanan yorum kutusu için aynı konu öğesine bağlı.
    Set Yayar kopya role özelliği yalnızca bağlantı Propagate kopyaya.Daha fazla bilgi için bkz: Bağlantı kopyalama davranışını özelleştirme.

  • Bağlantılı öğeleri kopyalamak. Örneğin, yeni bir öğe kopyaladığınızda, herhangi bir bağlantılı Yorum Kutusu kopyalarını da yapılır.
    Set Yayar kopya role özelliği bağlamak ve rol player karşısındaki Propagate kopya.Daha fazla bilgi için bkz: Bağlantı kopyalama davranışını özelleştirme.

  • Kopyalayıp yapıştırarak hızla yinelenen öğeleri. Normalde, kopyaladığınız öğe seçiliyken ve aynı türde öğe üzerine yapıştıramazsınız.
    Birleştirme bir öğe yönergesi etki alanı sýnýfýna ekleyin ve üst sınıf için ileriye doğru birleştirmelerinin ayarlayın.Bu sürükleme işlemleri aynı etkisi olacaktır.Daha fazla bilgi için bkz. Öğe oluşturma ve taşıma özelleştirme.

    - veya -

    Diyagramın öğelerini geçersiz kılarak yapıştırmadan önce seçin ClipboardCommandSet.ProcessOnPasteCommand().Özel bir DslPackage proje dosyasında bu kodu ekleyin:

    namespace Company.MyDsl {
    using System.Linq;
    using Microsoft.VisualStudio.Modeling.Diagrams; 
    using Microsoft.VisualStudio.Modeling.Shell;
    partial class MyDslClipboardCommandSet
    {
      protected override void ProcessOnMenuPasteCommand()
      {
     // Deselect the current selection after copying:
     Diagram diagram = (this.CurrentModelingDocView as SingleDiagramDocView).Diagram;
        this.CurrentModelingDocView
         .SelectObjects(1, new object[] { diagram }, 0);
      }
    } }
    
  • Kullanıcı seçili hedef yapıştırır, ek bağlantılar oluşturun. Örneğin, bir öğenin üstüne bir açıklama kutusuna yapıştırıldığında, bağlantı aralarında yapılır.
    Hedef etki alanı sınıfına öğesi birleştirme yönergesini ekleyin ve bağlantıları ekleyerek birleştirme işlemek için ayarlayın.Bu sürükleme işlemleri aynı etkisi olacaktır.Daha fazla bilgi için bkz. Öğe oluşturma ve taşıma özelleştirme.

    - veya -

    Geçersiz kılma ClipboardCommandSet.ProcessOnPasteCommand() temel yöntemi çağrıldıktan sonra ek bağlantılar oluşturmak için.

  • Hangi öğeleri kopyalanan biçimlerini özelleştirebildiğiniz bit eşlem formunda bir kenarlık eklemek için harici uygulamalara – Örneğin,.
    Geçersiz kılma MyDslClipboardCommandSet.ProcessOnMenuCopyCommand() DslPackage projesinde.

  • Nasıl öğeleri Pano'ya Kopyala komutunu, ancak bir sürükle işlemde kopyalanır özelleştirin.
    Geçersiz kılma MyDslClipboardCommandSet.CopyModelElementsIntoElementGroupPrototype() DslPackage projesinde.

  • Kopyala Şekil düzenini korumak ve yapıştırın.
    Kullanıcı birden çok şekil kopyalarken, bunlar yapıştırıldığında, ilgili konumlarını koruyabilir.Örneğe göre bu teknik gösterilmiştir vmsdk: devre diyagramları örnek.

    Bu etkiyi elde etmek için şekilleri ve bağlayıcıları için kopyalanan ElementGroupPrototype ekleyin.Geçersiz kılmak için en uygun ElementOperations.CreateElementGroupPrototype() yöntemidir.Bunu yapmak için aşağıdaki kodu Dsl projeye ekleyin:

    public class MyElementOperations : DesignSurfaceElementOperations
    {
      // Create an EGP to add to the clipboard.
      // Called when the elements to be copied have been
      // collected into an ElementGroup.
     protected override ElementGroupPrototype CreateElementGroupPrototype(ElementGroup elementGroup, ICollection<ModelElement> elements, ClosureType closureType)
      {
     // Add the shapes and connectors:
     // Get the elements already in the group:
        ModelElement[] mels = elementGroup.ModelElements
            .Concat(elementGroup.ElementLinks) // Omit if the paste target is not the diagram.
            .ToArray();
     // Get their shapes:
        IEnumerable<PresentationElement> shapes = 
           mels.SelectMany(mel => 
                PresentationViewsSubject.GetPresentation(mel));
        elementGroup.AddRange(shapes);
    
     return base.CreateElementGroupPrototype
               (elementGroup, elements, closureType);
      }
    
     public MyElementOperations(IServiceProvider serviceProvider, ElementOps1Diagram diagram)
          : base(serviceProvider, diagram)
      { }
    }
    
    // Replace the standard ElementOperations
    // singleton with your own:
    partial class MyDslDiagram // EDIT NAME
    {
     /// <summary>
     /// Singleton ElementOperations attached to this diagram.
     /// </summary>
     public override DesignSurfaceElementOperations ElementOperations
      {
     get
        {
     if (singleton == null)
          {
            singleton = new MyElementOperations(this.Store as IServiceProvider, this);
          }
     return singleton;
        }
      }
     private MyElementOperations singleton = null;
    }
    
  • Şekiller geçerli imleç konumu gibi seçtiğiniz bir konuma yapıştırın.
    Kullanıcı birden çok şekil kopyalarken, bunlar yapıştırıldığında, ilgili konumlarını koruyabilir.Örneğe göre bu teknik gösterilmiştir vmsdk: devre diyagramları örnek.

    Bu etkiyi elde etmek için geçersiz kılma ClipboardCommandSet.ProcessOnMenuPasteCommand() konuma özgü sürümünü kullanmaya ElementOperations.Merge().Bunu yapmak için DslPackage projede aşağıdaki kodu ekleyin:

    
    partial class MyDslClipboardCommandSet // EDIT NAME
    {
       /// <summary>
        /// This method assumes we only want to paste things onto the diagram
        /// - not onto anything contained in the diagram.
        /// The base method pastes in a free space on the diagram.
        /// But if the menu was used to invoke paste, we want to paste in the cursor position.
        /// </summary>
        protected override void ProcessOnMenuPasteCommand()
        {
    
      NestedShapesSampleDocView docView = this.CurrentModelingDocView as NestedShapesSampleDocView;
    
          // Retrieve data from clipboard:
          System.Windows.Forms.IDataObject data = System.Windows.Forms.Clipboard.GetDataObject();
    
          Diagram diagram = docView.CurrentDiagram;
          if (diagram == null) return;
    
          if (!docView.IsContextMenuShowing)
          {
            // User hit CTRL+V - just use base method.
    
            // Deselect anything that's selected, otherwise
            // pasted item will be incompatible:
            if (!this.IsDiagramSelected())
            {
              docView.SelectObjects(1, new object[] { diagram }, 0);
            }
    
            // Paste into a convenient spare space on diagram:
        base.ProcessOnMenuPasteCommand();
          }
          else
          {
            // User right-clicked - paste at mouse position.
    
            // Utility class:
            DesignSurfaceElementOperations op = diagram.ElementOperations;
    
            ShapeElement pasteTarget = diagram;
    
            // Check whether what's in the paste buffer is acceptable on the target.
            if (pasteTarget != null && op.CanMerge(pasteTarget, data))
            {
    
            // Although op.Merge would be a no-op if CanMerge failed, we check CanMerge first
              // so that we don't create an empty transaction (after which Undo would be no-op).
              using (Transaction t = diagram.Store.TransactionManager.BeginTransaction("paste"))
              {
                PointD place = docView.ContextMenuMousePosition;
                op.Merge(pasteTarget, data, PointD.ToPointF(place));
                t.Commit();
              }
            }
          }
        }
      }
    
  • Kullanıcının öğeleri sürükleyip izin verin.
    Bkz: Nasıl yapılır: sürükle ve bırak işleyicisi ekleyin

Bağlantı kopyalama davranışını özelleştirme

Kullanıcı bir öğeyi kopyalar herhangi bir katıştırılmış öğeler de kopyalanır ve standart davranış olur.Davranış kopyalama standart değiştirebilirsiniz.dsl tanımında bir ilişkinin ve Properties penceresi kümesindeki bir tarafta bir rol seçin Yayar kopya değeri.

Etki alanı rolü Kopyala özelliğini yayar

Üç değer vardır:

  • Kopya yaymak değil

  • Yalnızca - bağlamak için kopya yay grubu yapıştırıldığında, bu bağlantının yeni bir kopyasını bağlantının diğer ucundaki varolan öğesine başvuruda bulunacak.

  • Bağlamak için kopya yaymak ve rol player - kopyalanan Grup öğesi bağlantının diğer ucundaki bir kopyasını içerir.

Kopyalama ile PropagateCopyToLinkOnly etkisi

Yaptığınız değişiklikler, öğeleri hem de Kopyalanan görüntüyü etkiler.

Programlama Kopyala ve Yapıştır davranışı

Birçok DSL'ın Kopyala, Yapıştır, oluşturma ve nesnelerin silinmesi bakımından davranışı yönlerini örneği tarafından yönetilir ElementOperations diyagrama gevşekçe.Kendi sınıfından türeyen tarafından DSL'ın davranışını değiştirebilirsiniz ElementOperations ve geçersiz kılma ElementOperations Diyagram sınıfının özellik.

İpucuİpucu

Program kodunu kullanarak modeli özelleştirme hakkında daha fazla bilgi için bkz: Gezinme ve Program kodunda bir modeli güncelleştiriliyor.

Kopyalama işlemi için sıralı diyagramıYapıştırma işleminin sıralı diyagramı

Kendi ElementOperations tanımlamak için

  1. dsl projenize yeni bir dosyada alanından türetilmiş bir sınıf oluşturmak DesignSurfaceElementOperations.

  2. Diyagram sınıfınızın parçalı sınıf tanımına ekleyin.Bu sınıfın adını bulunabilir Dsl\GeneratedCode\Diagrams.cs.

    Diyagram sınıfta ElementOperations ElementOperations alt sınıfınızda bir örneğini döndürmek için.Her çağrısında aynı örneğini döndürmesi gerekir.

DslPackage proje özel kod dosyasında bu kodu ekleyin:

using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
using Microsoft.VisualStudio.Modeling.Diagrams.ExtensionEnablement;

  public partial class MyDslDiagram
  {
    public override DesignSurfaceElementOperations ElementOperations
    {
      get
      {
        if (this.elementOperations == null)
        {
          this.elementOperations = new MyElementOperations(this.Store as IServiceProvider, this);
        }
        return this.elementOperations;
      }
    }
    private MyElementOperations elementOperations = null;
  }

  public class MyElementOperations : DesignSurfaceElementOperations
  {
    public MyElementOperations(IServiceProvider serviceProvider, MyDslDiagram diagram)
      : base(serviceProvider, diagram)
    { }
    // Overridden methods follow
  }

Diğer modellerden sürüklenen öğeleri alma

ElementOperations, kopyalama, taşıma, silme ve sürükle ve bırak davranışını tanımlamak için de kullanılabilir.ElementOperations kullanımına örnek, burada verilen örnek özel sürükle ve bırak davranışını tanımlar.Ancak, bu amaçla, açıklanan alternatif yaklaşım düşünebilirsiniz Nasıl yapılır: sürükle ve bırak işleyicisi ekleyin, daha Genişletilebilir olduğu.

ElementOperations sınıfınızda iki yöntemi tanımlar:

  • CanMerge(ModelElement targetElement, System.Windows.Forms.IDataObject data)hangi kaynak öğesinde hedef şekli, bağlayıcı veya diyagram sürüklenebilir olup olmadığını belirler.

  • MergeElementGroupPrototype(ModelElement targetElement, ElementGroupPrototype sourcePrototype)hangi kaynak öğesinde hedef içinde birleştirir.

Ff521398.collapse_all(tr-tr,VS.110).gifCanMerge()

[CanMerge()]Diyagram üzerinde fare hareket ettikçe, kullanıcıya verilmeli görüş belirlemek için çağrılır.Yöntem için öğenin üzerinde fare vurgulama ve sürükleme işlemi gerçekleştirildi kaynağı hakkında veri parametreleridir.Kullanıcı herhangi bir yerde ekranda sürükleyebilirsiniz.Bu nedenle, kaynak nesnenin farklı türlerde olabilir ve farklı biçimlerde seri hale getirilebilir.Kaynak bir dsl veya uml modeli veri parametre serileştirmek ise, bir ElementGroupPrototype.Sürükle ve Kopyala araç işlemleri ElementGroupPrototypes modellerin parçaları göstermek için kullanın.

Bir öğe grubu prototip herhangi bir sayıda öğe ve bağlantılar içerebilir.Öğe türlerini GUID'lerine göre belirlenebilir.Temel modeli öğe sürüklenmiştir şekilden GUID'dir.Aşağıdaki örnekte, CanMerge() Bu diyagram uml Diyagram sınıf şekilden sürüklenirse true değerini döndürür.

public override bool CanMerge(ModelElement targetShape, System.Windows.Forms.IDataObject data)
 {
  // Extract the element prototype from the data.
  ElementGroupPrototype prototype = ElementOperations.GetElementGroupPrototype(this.ServiceProvider, data);
  if (targetShape is MyTargetShape && prototype != null &&
        prototype.RootProtoElements.Any(rootElement => 
          rootElement.DomainClassId.ToString() 
          ==  "3866d10c-cc4e-438b-b46f-bb24380e1678")) // Guid of UML Class shapes
          // or SourceClass.DomainClassId
        return true;
   return base.CanMerge(targetShape, data);
 }

MergeElementGroupPrototype()

Kullanıcı bir öğenin üstüne bir diyagram, Şekil veya bağlayıcı düştüğünde bu yöntem çaðrýlýr.Sürüklenen içeriği hedef öğe birleştirmeniz gerekir.Bu örnekte, kodun birleşimi, hedef ve prototip türlerini tanıyıp tanımadığını belirler; Bu durumda, yöntem prototip modele eklenmesi gereken öğeleri sürüklenen öğeler dönüştürür.Birleştirme dönüştürülen veya Dönüştürülmeyen öğelerinin gerçekleştirmek için temel yöntemi çağrılır.

    public override void MergeElementGroupPrototype(ModelElement targetShape, ElementGroupPrototype sourcePrototype)
    {
      ElementGroupPrototype prototypeToMerge = sourcePrototype;
      MyTargetShape pel = targetShape as MyTargetShape;
      if (pel != null)
      {
        prototypeToMerge = ConvertDraggedTypeToLocal(pel, sourcePrototype);
      }
      if (prototypeToMerge != null)
        base.MergeElementGroupPrototype(targetShape, prototypeToMerge);
    }

Bu örnek, bir uml sınıf diyagramından sürüklenen uml sınıf öğesi ile ilgilenir.dsl uml sınıflarını doğrudan saklamak üzere tasarlanmamıştır, ancak bunun yerine, biz her sürüklenen uml sınıfı için bir dsl öğesi oluşturun.Örneğin, dsl örnek diyagramı ise bu yararlı olacaktır.Kullanıcı sınıfları, bu sınıfların örneklerini oluşturmak için Diyagram sürükleyebilirsiniz.

    private ElementGroupPrototype ConvertDraggedTypeToLocal (MyTargetShape snapshot, ElementGroupPrototype prototype)
    {
      // Find the UML project:
      EnvDTE.DTE dte = snapshot.Store.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
      foreach (EnvDTE.Project project in dte.Solution.Projects)
      {
        IModelingProject modelingProject = project as IModelingProject;
        if (modelingProject == null) continue; // not a modeling project
        IModelStore store = modelingProject.Store;
        if (store == null) continue;
        // Look for the shape that was dragged:
        foreach (IDiagram umlDiagram in store.Diagrams())
        {
          // Get modeling diagram that implements UML diagram:
          Diagram diagram = umlDiagram.GetObject<Diagram>();
          Guid elementId = prototype.SourceRootElementIds.FirstOrDefault();
          ShapeElement shape = diagram.Partition.ElementDirectory.FindElement(elementId) as ShapeElement;
          if (shape == null) continue;
          IClass classElement = shape.ModelElement as IClass;
          if (classElement == null) continue;
          
          // Create a prototype of elements in my DSL, based on the UML element:
          Instance instance = new Instance(snapshot.Store);
          instance.Type = classElement.Name;
          // Pack them into a prototype:
          ElementGroup group = new ElementGroup(instance);
          return group.CreatePrototype();
        }
      }
      return null;
    }

Standart kopyalama davranýþýnýn

Bu bölümdeki kod kopyalama davranışını değiştirmek için şunları yapabilirsiniz yöntemleri geçersiz kılabilirsiniz gösterir.Kendi özelleştirmelerinizi elde etmek nasıl yardımcı olmak için bu bölümde kopyalama söz konusu yöntemleri geçersiz kılan kodunu gösterir, ancak standart davranışını değiştirmez.

Ne zaman kullanıcı ctrl + c tuşuna bastığında veya kopya menü komutu yöntemi kullanır ProcessOnMenuCopyCommand olarak adlandırılır.Nasıl bu ayarlanır görebilirsiniz DslPackage\Generated Code\CommandSet.cs.Komutları kurma şeklini hakkında daha fazla bilgi için bkz: Nasıl yapılır: kısayol menüsüne komut ekleme.

Kısmi sınıf tanımı ekleyerek ProcessOnMenuCopyCommand kılabilirsiniz MyDslClipboardCommandSet DslPackage projesinde.

using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;

partial class MyDslClipboardCommandSet
{
  /// <summary>
  /// Override ProcessOnMenuCopyCommand() to copy elements to the
  /// clipboard in different formats, or to perform additional tasks
  /// before or after copying – for example deselect the copied elements.
  /// </summary>
  protected override void ProcessOnMenuCopyCommand()
  {
    IList<ModelElement> selectedModelElements = this.SelectedElements;
    if (selectedModelElements.Count == 0) return;

    // System container for clipboard data.
    // The IDataObject can contain data in several formats.
    IDataObject dataObject = new DataObject();
      
    Bitmap bitmap = null; // For export to other programs.
    try
    {
      #region Create EGP for copying to a DSL.
      this.CopyModelElementsIntoElementGroupPrototype
                     (dataObject, selectedModelElements);
      #endregion
      
      #region Create bitmap for copying to another application. 
      // Find all the shapes associated with this selection:
      List<ShapeElement> shapes = new List<ShapeElement>(
        this.ResolveExportedShapesForClipboardImages
              (dataObject, selectedModelElements));

      bitmap = this.CreateBitmapForClipboard(shapes);
      if (bitmap != null)
      {
        dataObject.SetData(DataFormats.Bitmap, bitmap);
      }
      #endregion 
     
      // Add the data to the clipboard:
      Clipboard.SetDataObject(dataObject, true, 5, 100);
    }
    finally
    {
      // Dispose bitmap after SetDataObject:
      if (bitmap != null) bitmap.Dispose();
    }
  }
/// <summary>
/// Override this to customize the element group that is copied to the clipboard.
/// </summary>
protected override void CopyModelElementsIntoElementGroupPrototype(IDataObject dataObject, IList<ModelElement> selectedModelElements)
{
  return this.ElementOperations.Copy(dataObject, selectedModelElements);
}
}

Her Diyagram ElementOperations tek örneği vardır.Kendi türevi sağlayabilir.dsl projede yerleştirilebilir, bu dosya, geçersiz kılar kodu aynı şekilde davranır:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;

namespace Company.MyDsl
{
  partial class MyDslDiagram
  {
    /// <summary>
    /// Singleton ElementOperations attached to this diagram.
    /// </summary>
    public override DesignSurfaceElementOperations ElementOperations
    {
      get
      {
        if (this.elementOperations == null)
        {
          this.elementOperations = new MyElementOperations(this.Store as IServiceProvider, this);
        }
        return this.elementOperations;
      }
    }
    private MyElementOperations elementOperations = null;
  }

  // Our own version of ElementOperations so that we can override:
  public class MyElementOperations : DesignSurfaceElementOperations
  {
    public MyElementOperations(IServiceProvider serviceProvider, ElementOps1Diagram diagram)
      : base(serviceProvider, diagram)
    { }


     
    /// <summary>
    /// Copy elements to the clipboard data.
    /// Provides a hook for adding custom data.
    /// </summary>
    public override void Copy(System.Windows.Forms.IDataObject data, 
      ICollection<ModelElement> elements, 
      ClosureType closureType, 
      System.Drawing.PointF sourcePosition)
    {
      if (CanAddElementGroupFormat(elements, closureType))
      {
        AddElementGroupFormat(data, elements, closureType); 
      }

      // Override these to store additional data:
      if (CanAddCustomFormat(elements, closureType))
      {
        AddCustomFormat(data, elements, closureType, sourcePosition);
      }
    }
     
    
    protected override void AddElementGroupFormat(System.Windows.Forms.IDataObject data, ICollection<ModelElement> elements, ClosureType closureType)
    {
      // Add the selected elements and those implied by the propagate copy rules:
      ElementGroup elementGroup = this.CreateElementGroup(elements, closureType);

      // Mark all the elements that are not embedded under other elements:
      this.MarkRootElements(elementGroup, elements, closureType);

      // Store in the clipboard data:
      ElementGroupPrototype elementGroupPrototype = this.CreateElementGroupPrototype(elementGroup, elements, closureType);
      data.SetData(ElementGroupPrototype.DefaultDataFormatName, elementGroupPrototype);
    }

    /// <summary>
    /// Override this to store additional elements in the element group:
    /// </summary>
    protected override ElementGroupPrototype CreateElementGroupPrototype(ElementGroup elementGroup, ICollection<ModelElement> elements, ClosureType closureType)
    {
      ElementGroupPrototype prototype = new ElementGroupPrototype(this.Partition, elementGroup.RootElements, elementGroup);
      return prototype;
    }

    /// <summary>
    /// Create an element group from the given starting elements, using the 
    /// copy propagation rules specified in the DSL Definition.
    /// By default, this includes all the embedded descendants of the starting elements,
    /// and also includes reference links where both ends are already included.
    /// </summary>
    /// <param name="startElements">model elements to copy</param>
    /// <param name="closureType"></param>
    /// <returns></returns>
    protected override ElementGroup CreateElementGroup(ICollection<ModelElement> startElements, ClosureType closureType)
    {
      // ElementClosureWalker finds all the connected elements, 
      // according to the propagate copy rules specified in the DSL Definition:
      ElementClosureWalker walker = new ElementClosureWalker(this.Partition, 
        closureType, // Normally ClosureType.CopyClosure
        startElements, 
        true, // Do not load other models.
        null, // Optional list of domain roles not to traverse.
        true); // Include relationship links where both ends are already included.
      
      walker.Traverse(startElements);
      IList<ModelElement> closureList = walker.ClosureList;
      Dictionary<object, object> closureContext = walker.Context;

      // create a group for this closure
      ElementGroup group = new ElementGroup(this.Partition);
      group.AddRange(closureList, false);

      // create the element group prototype for the group
      foreach (object key in closureContext.Keys)
      {
        group.SourceContext.ContextInfo[key] = closureContext[key];
      }

      return group;
    }
  }
}

Ayrıca bkz.

Kavramlar

Öğe oluşturma ve taşıma özelleştirme

Nasıl yapılır: sürükle ve bırak işleyicisi ekleyin

Silme davranışı özelleştirme

Diğer Kaynaklar

Örnek: vmsdk devresi diyagramları örnek