Kopyalama Davranışını Özelleştirme

Visual Studio Görselleştirme ve Modelleme SDK'sı ile oluşturulan etki alanına özgü bir dilde (DSL), kullanıcı öğeleri kopyalayıp yapıştırdığında ne olacağını değiştirebilirsiniz.

Standart Kopyalama ve Yapıştırma Davranışı

Kopyalamayı etkinleştirmek için DSL Gezgini'nde Düzenleyici düğümünün Kopya Yapıştırmayı Etkinleştir özelliğini ayarlayın.

Varsayılan olarak, kullanıcı öğeleri panoya kopyaladığında aşağıdaki öğeler de kopyalanır:

  • Seçili öğelerin katıştırılmış alt öğeleri. (Başka bir ifadeyle, kopyalanan öğelerde kaynaklanan ekleme ilişkilerinin hedefleri olan öğeler.)

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

    Bu kural kopyalanan öğelere ve bağlantılara özyinelemeli olarak uygulanır.

    Copied and pasted elements

    Kopyalanan öğeler ve bağlantılar serileştirilir ve panoya yerleştirilen bir ElementGroupPrototype (EGP) içinde depolanır.

    Kopyalanan öğelerin resmi de panoya yerleştirilir. Bu, kullanıcının Word gibi diğer uygulamalara yapıştırmasına olanak tanır.

    Kullanıcı, kopyalanan öğeleri DSL Tanımına göre kabul eden bir hedefe yapıştırabilir. Örneğin, bileşenler çözüm şablonundan oluşturulan bir DSL'de kullanıcı bağlantı noktalarını diyagrama değil bileşenlere yapıştırabilir; ve bileşenleri diyagrama yapıştırabilir, ancak diğer bileşenlere yapıştıramayabilir.

Kopyalama ve Yapıştırma Davranışını Özelleştirme

Program kodunu kullanarak modeli özelleştirme hakkında daha fazla bilgi için bkz . Program Kodunda ModelDe Gezinme ve Güncelleştirme.

Kopyalama, kesme ve yapıştırmayı etkinleştirin veya devre dışı bırakın. DSL Gezgini'nde Düzenleyici düğümünün Kopya Yapıştırmayı Etkinleştir özelliğini ayarlayın.

Bağlantıları aynı hedefe kopyalayın. Örneğin, kopyalanan bir açıklama kutusunun aynı konu öğesine bağlı olması için. Rolün Kopyayı Yay özelliğini Kopyayı yalnızca bağlantıya yay olarak ayarlayın. Daha fazla bilgi için bkz . Bağlantı Kopyalama Davranışını Özelleştirme.

Bağlantılı öğeleri kopyalama. Örneğin, yeni bir öğeyi kopyaladığınızda, bağlantılı açıklama kutularının kopyaları da oluşturulur. Rolün Kopyayı Yay özelliğini Kopyayı bağlamaya ve karşı rol yürütücüsünü yayacak şekilde ayarlayın. Daha fazla bilgi için bkz . Bağlantı Kopyalama Davranışını Özelleştirme.

Öğeleri kopyalayıp yapıştırarak hızla çoğaltabilirsiniz. Normalde, yeni kopyaladığınız öğe seçili durumda kalır ve aynı öğe türünü bu öğeye yapıştıramazsınız. Etki alanı sınıfına bir Öğe Birleştirme Yönergesi ekleyin ve birleştirmeleri üst sınıfa iletecek şekilde ayarlayın. Bu, sürükleme işlemleri üzerinde aynı etkiye sahip olacaktır. Daha fazla bilgi için bkz . Öğe Oluşturma ve Taşımayı Özelleştirme.

- veya -

öğeleri yapıştırmadan önce, geçersiz kılarak ClipboardCommandSet.ProcessOnPasteCommand()diyagramı seçin. Bu kodu DslPackage projesindeki özel bir dosyaya 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çilen bir hedefe yapıştırdığında ek bağlantılar oluşturun. Örneğin, bir açıklama kutusu bir öğeye yapıştırıldığında, aralarında bir bağlantı oluşturulur. Hedef etki alanı sınıfına bir Öğe Birleştirme Yönergesi ekleyin ve bağlantıları ekleyerek birleştirmeyi işleyecek şekilde ayarlayın. Bu, sürükleme işlemleri üzerinde aynı etkiye sahip olacaktır. Daha fazla bilgi için bkz . Öğe Oluşturma ve Taşımayı Özelleştirme.

- veya -

Temel yöntemi çağırdıktan sonra ek bağlantıları oluşturmak için geçersiz kılın ClipboardCommandSet.ProcessOnPasteCommand() .

Bit eşlem formuna kenarlık eklemek için, öğelerin dış uygulamalara kopyalanabileceği biçimleri özelleştirin. DslPackage projesinde MyDsl'iClipboardCommandSet.ProcessOnMenuCopyCommand() geçersiz kılın.

Öğelerin kopyalama komutuyla panoya kopyalanma şeklini özelleştirin, ancak sürükleme işleminde kopyalamayın. DslPackage projesinde MyDsl'iClipboardCommandSet.CopyModelElementsIntoElementGroupPrototype() geçersiz kılın.

Kopyalayıp yapıştırarak şekil düzenini koruyun. Kullanıcı birden çok şekil kopyaladığında, yapıştırıldığında göreli konumlarını koruyabilirsiniz. Bu teknik, VMSDK: Devre Diyagramları örneği'ndeki örnek tarafından gösterilmiştir.

Bu etkiyi elde etmek için şekilleri ve bağlayıcıları kopyalanan ElementGroupPrototype öğesine ekleyin. Geçersiz kılmak için en uygun yöntem ElementOperations.CreateElementGroupPrototype() yöntemidir. Bunu yapmak için Dsl projesine aşağıdaki kodu 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;
}

Şekilleri, geçerli imleç konumu gibi seçili bir konuma yapıştırın. Kullanıcı birden çok şekil kopyaladığında, yapıştırıldığında göreli konumlarını koruyabilirsiniz. Bu teknik, VMSDK: Devre Diyagramları örneği'ndeki örnek tarafından gösterilmiştir.

Bu etkiyi elde etmek için konumuna özgü sürümünü ElementOperations.Merge()kullanmak üzere geçersiz kılınClipboardCommandSet.ProcessOnMenuPasteCommand(). Bunu yapmak için DslPackage projesine 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 bırakmasına izin verin. Bkz . Nasıl yapılır: Sürükle ve Bırak İşleyicisi Ekleme.

Kullanıcı bir öğeyi kopyaladığında, standart davranış eklenmiş öğelerin de kopyalanmış olmasıdır. Standart kopyalama davranışını değiştirebilirsiniz. DSL Tanımı'nda, ilişkinin bir tarafındaki rolü seçin ve Özellikler penceresi Kopyayı Yay değerini ayarlayın.

Propagates Copy property of domain role

Üç değer vardır:

  • Kopyayı yayma

  • Kopyayı yalnızca bağlantıya yay - grup yapıştırıldığında, bu bağlantının yeni kopyası bağlantının diğer ucundaki var olan öğeye başvurur.

  • Kopyayı bağlantı ve karşı rol oynatıcıya yayma - kopyalanan grup, bağlantının diğer ucunda öğenin bir kopyasını içerir.

    Effect of copying with PropagateCopyToLinkOnly

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

Programlama Kopyalama ve Yapıştırma Davranışı

DSL'nin nesnelerin kopyalanması, yapıştırılması, oluşturulması ve silinmesiyle ilgili davranışının birçok yönü diyagramla birleştirilmiş bir örneği ElementOperations tarafından yönetilir. Kendi sınıfınızı türeterek ve diyagram sınıfınızın ElementOperations özelliğini geçersiz kılarak ElementOperations DSL'nizin davranışını değiştirebilirsiniz.

İpucu

Program kodunu kullanarak modeli özelleştirme hakkında daha fazla bilgi için bkz . Program Kodunda ModelDe Gezinme ve Güncelleştirme.

Sequence diagram for the Copy operation

Sequence diagram of Paste operation

Kendi ElementOperations'larınızı tanımlamak için

  1. DSL projenizdeki yeni bir dosyada, öğesinden DesignSurfaceElementOperationstüretilen bir sınıf oluşturun.

  2. Diyagram sınıfınız için kısmi bir sınıf tanımı ekleyin. Bu sınıfın adı Dsl\GeneratedCode\Diagrams.cs içinde bulunabilir.

    Diyagram sınıfında, ElementOperations alt sınıfınızın bir örneğini döndürmek için geçersiz kılın ElementOperations . Her çağrıda aynı örneği döndürmelisiniz.

    Bu kodu DslPackage projesindeki özel bir kod dosyasına 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ükleyip bırakma davranışını tanımlamak için de kullanılabilir. ElementOperations kullanımının bir gösterimi olarak, burada verilen örnek özel sürükle ve bırak davranışını tanımlar. Ancak bu amaçla, Daha genişletilebilir olan Nasıl yapılır: Sürükle ve Bırak İşleyicisi Ekleme başlığı altında açıklanan alternatif yaklaşımı göz önünde bulundurabilirsiniz.

ElementOperations sınıfınızda iki yöntem tanımlayın:

  • CanMerge(ModelElement targetElement, System.Windows.Forms.IDataObject data) kaynak öğenin hedef şekle, bağlayıcıya veya diyagrama sürüklenip sürüklenemeyeceğini belirler.

  • MergeElementGroupPrototype(ModelElement targetElement, ElementGroupPrototype sourcePrototype) kaynak öğesini hedefte birleştirir.

CanMerge()

CanMerge() , fare diyagram boyunca hareket ettikçe kullanıcıya verilmesi gereken geri bildirimleri belirlemek için çağrılır. yöntemine yönelik parametreler, farenin üzerine gelindiği öğe ve sürükleme işleminin gerçekleştirildiği kaynakla ilgili verilerdir. Kullanıcı ekranın herhangi bir yerinden sürükleyebilir. Bu nedenle, kaynak nesne birçok farklı türde olabilir ve farklı biçimlerde seri hale getirilebilir. Kaynak bir DSL veya UML modeliyse, veri parametresi bir ElementGroupPrototypeserileştirmedir. Sürükleme, kopyalama ve araç kutusu işlemleri, model parçalarını temsil etmek için ElementGroupPrototypes kullanır.

Öğe Grubu Prototipi herhangi bir sayıda öğe ve bağlantı içerebilir. Öğe türleri GUID'leri tarafından tanımlanabilir. GUID, temel alınan model öğesini değil sürüklenen şeklindir. Aşağıdaki örnekte, CanMerge() UML diyagramından bir sınıf şekli bu diyagrama sürüklenirse true 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ı diyagrama, şekle veya bağlayıcıya öğeyi bıraktığında bu yöntem çağrılır. Sürüklenen içeriği hedef öğeyle birleştirmelidir. Bu örnekte kod, hedef ve prototip türlerinin birleşimini tanıyıp tanımadığını belirler; bu durumda, yöntemi sürüklenen öğeleri modele eklenmesi gereken öğelerin prototipine dönüştürür. Dönüştürülen veya dönüştürülmeyen öğelerden biri olan birleştirmeyi gerçekleştirmek için temel yöntem ç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, UML sınıf diyagramından sürüklenen UML sınıf öğeleriyle ilgilidir. DSL, UML sınıflarını doğrudan depolamak için tasarlanmamıştır, ancak bunun yerine sürüklenen her UML sınıfı için bir DSL öğesi oluştururuz. Bu, örneğin DSL bir örnek diyagramıysa yararlı olabilir. Kullanıcı, bu sınıfların örneklerini oluşturmak için sınıfları diyagrama sürükleyebilir.


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ışı

Bu bölümdeki kod, kopyalama davranışını değiştirmek için geçersiz kılabileceğiniz yöntemleri gösterir. Kendi özelleştirmelerinizi nasıl başarabileceğinizi görmenize yardımcı olmak için, bu bölümde kopyalamaya dahil olan yöntemleri geçersiz kılan ancak standart davranışı değiştirmeyen kod gösterilir.

Kullanıcı CTRL+C tuşlarına bastığında veya Kopyala menü komutunu kullandığında yöntemi ProcessOnMenuCopyCommand çağrılır. Bunun nasıl ayarlandığını DslPackage\Generated Code\CommandSet.cs içinde görebilirsiniz. Komutların nasıl ayarlandığı hakkında daha fazla bilgi için bkz . Nasıl yapılır: Kısayol Menüsüne Komut Ekleme.

DslPackage projesinde MyDsl'in ClipboardCommandSet kısmi sınıf tanımını ekleyerek ProcessOnMenuCopyCommand'ı geçersiz kılabilirsiniz.

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 diyagramda ElementOperations'ın tek bir örneği vardır. Kendi türevini sağlayabilirsin. DSL projesine yerleştirilebilen bu dosya, geçersiz kıldığı kodla 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;
    }
  }
}

Not

Metin Şablonu Dönüştürme bileşeni, Visual Studio uzantısı geliştirme iş yükünün bir parçası olarak otomatik olarak yüklenir. Ayrıca Visual Studio Yükleyicisi Tek tek bileşenler sekmesinden SDK'lar, kitaplıklar ve çerçeveler kategorisinin altından da yükleyebilirsiniz. Tek tek bileşenler sekmesinden Modelleme SDK'sı bileşenini yükleyin.