Udostępnij za pośrednictwem


Dostosowywanie zachowania dotyczącego kopiowania

W języku specyficznego dla domeny (DSL), utworzone za pomocą Visual Studio wizualizacji i modelowania SDK można zmienić, co się stanie, gdy użytkownik kopiuje i wklejania elementów.

Standard Kopiuj i Wklej zachowanie

Aby włączyć kopiowanie, należy ustawić Włącz Kopiuj wklej właściwości edytora węzła w Eksploratorze DSL.

Domyślnie gdy użytkownik kopiuje elementy do Schowka, następujące pozycje są również kopiowane:

  • Osadzone obiekty podrzędne wybranych elementów.(Oznacza to, że elementy o wartościach celów osadzenia relacje, które pochodzą w kopiowane elementy).

  • Łącza relacji między skopiowane elementy.

Ta reguła ma zastosowanie rekursywnie skopiowane elementy i łącza.

Skopiowane i wklejone elementy

Skopiowane elementy łącza serializacji i są przechowywane w ElementGroupPrototype (EGP), który znajduje się w Schowku.

W Schowku znajduje się również obraz skopiowane elementy.Dzięki temu użytkownikowi wkleić do innych aplikacji, takich jak Word.

Użytkownik może wkleić skopiowane elementy do obiektu docelowego, który może zawierać elementy zgodnie z definicją DSL.Na przykład w DSL, wygenerowana na podstawie szablonu rozwiązania składniki, użytkownik może Wklej portów na składniki, ale nie na diagram; i wkleić składników na diagram, ale nie na inne składniki.

Dostosowywanie Kopiuj i Wklej zachowanie

Aby uzyskać więcej informacji dotyczących dostosowywania modelu przy użyciu kodu programu, zobacz Nawigowanie i aktualizowanie modelu w kodzie programu.

  • Włącz lub wyłącz Kopiuj, Wytnij i Wklej.
    W Eksploratorze DSL ustawić Włącz Kopiuj wklej właściwości edytora węzła.

  • Kopiowanie łączy do tego samego obiektu docelowego. Na przykład mieć pole Komentarz skopiowanych połączone z tego samego elementu tematu.
    Ustaw propaguje kopii właściwości roli do propagację kopiowania, aby połączyć tylko.Aby uzyskać więcej informacji, zobacz dostosowywania zachowanie kopii łącze.

  • Kopiowanie połączonych elementów. Na przykład podczas kopiowania nowego elementu, kopie pól połączonych komentarz stają się także.
    Ustaw propaguje kopii właściwości roli do propagację kopii do łącza i przeciwnej pełniącego rolę.Aby uzyskać więcej informacji, zobacz dostosowywania zachowanie kopii łącze.

  • Kopiowanie i wklejanie szybko zduplikowane elementy. Zazwyczaj element, który został skopiowany nadal jest zaznaczone, a nie można wkleić tego samego typu elementu na niego.
    Dodaj Element Scal dyrektywy do klasy domeny i ustaw dla niej do scalenia do przodu do klasy nadrzędnej.Ma to taki sam efekt operacji przeciągania.Aby uzyskać więcej informacji, zobacz Dostosowywanie tworzenia i przesuwania elementów.

    —lub—

    Wybierz diagram przed wklejanie elementów, przez zastąpienie ClipboardCommandSet.ProcessOnPasteCommand().Dodaj ten kod niestandardowy plik w projekcie DslPackage:

    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);
      }
    } }
    
  • Utwórz dodatkowe łącza, gdy użytkownik wklejony do wybranego obiektu docelowego. Na przykład pole komentarza jest wklejane na element, łącze się między nimi.
    Dodaj Element scalania dyrektywy do klasy docelowej domeny, a jest ustawiony do przetwarzania scalania przez dodanie łącza.Ma to taki sam efekt operacji przeciągania.Aby uzyskać więcej informacji, zobacz Dostosowywanie tworzenia i przesuwania elementów.

    —lub—

    Zastąp ClipboardCommandSet.ProcessOnPasteCommand() można utworzyć dodatkowe łącza po wywołaniu metody podstawowej.

  • Dostosowywanie formatów, w których mogą być kopiowane elementy do zewnętrznych aplikacji — na przykład, aby dodać obramowanie do formularza mapy bitowej.
    Zastąp MyDslClipboardCommandSet.ProcessOnMenuCopyCommand() w projekcie DslPackage.

  • Dostosować, jak elementy są kopiowane do Schowka za pomocą polecenia kopiowania, ale nie należy do operacji przeciągania.
    Zastąp MyDslClipboardCommandSet.CopyModelElementsIntoElementGroupPrototype() w projekcie DslPackage.

  • Zachowaj układ kształt przy użyciu polecenia Kopiuj i Wklej.
    Gdy użytkownik kopiuje wiele kształtów, gdy zostaną wklejone można zachować ich pozycji względem siebie.Ta metoda przedstawiono na przykładzie w VMSDK: Przykładowe diagramy obwód.

    Do osiągnięcia efektu, Dodaj kształty i łączniki do skopiowanych ElementGroupPrototype.Najbardziej wygodne metody do zastępowania jest ElementOperations.CreateElementGroupPrototype().Aby to zrobić, Dodaj następujący kod do projektu Dsl:

    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;
    }
    
  • Wklej kształtów w wybranej lokalizacji, takich jak bieżącym położeniu kursora.
    Gdy użytkownik kopiuje wiele kształtów, gdy zostaną wklejone można zachować ich pozycji względem siebie.Ta metoda przedstawiono na przykładzie w VMSDK: Przykładowe diagramy obwód.

    Aby osiągnąć, Zastąp ClipboardCommandSet.ProcessOnMenuPasteCommand() do użycia lokalizacji w wersji ElementOperations.Merge().Aby to zrobić, Dodaj następujący kod w projekcie DslPackage:

    
    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();
              }
            }
          }
        }
      }
    
  • Umożliwianie użytkownikowi przeciągnij i upuść elementy.
    Zobacz Porady: dodawanie obsługi przeciągania i upuszczania.

Dostosowywanie zachowania kopii łącza

Gdy użytkownik kopiuje element, standardowe zachowanie jest wszystkie osadzone elementy są również kopiowane.Można modyfikować standardowy kopiowanie zachowanie.W definicji DSL, wybierz rolę po jednej stronie relacji i w zestawie właściwości okna propaguje kopii wartość.

Propaguje właściwości kopiowania roli domeny

Istnieją trzy wartości:

  • Propagowaniu kopiowania

  • Propagację kopiowania, aby połączyć tylko — po wklejeniu grupy, nową kopię tego łącza będzie odwoływać się do istniejącego elementu na końcu łącza.

  • Propagację kopii do połączenia i przeciwnej pełniącego rolę - grupą skopiowanych zawiera kopię elementu na końcu łącza.

Efekt kopiowania z PropagateCopyToLinkOnly

Zmiany wprowadzone będzie miała wpływ na zarówno elementy i obraz, który zostanie skopiowany.

Programowanie Kopiuj i Wklej zachowanie

Wystąpienie reguluje wielu aspektów zachowanie DSL w odniesieniu do kopiowania, wklejania, tworzenia i usuwania obiektów ElementOperations który jest sprzężona diagramu.Można zmodyfikować swoje DSL zachowanie wynikające klasie z ElementOperations i zastępowanie ElementOperations właściwości klasy diagramu.

PoradaPorada

Aby uzyskać więcej informacji dotyczących dostosowywania modelu przy użyciu kodu programu, zobacz Nawigowanie i aktualizowanie modelu w kodzie programu.

Diagram sekwencji dla operacji kopiowaniaDiagram sekwencji operacji wklejania

Aby zdefiniować własne ElementOperations

  1. W nowym pliku w projekcie DSL, należy utworzyć klasę, która jest tworzony na podstawie DesignSurfaceElementOperations.

  2. Dodaj definicję częściowej klasy własnej klasy diagramu.Nazwa tej klasy można znaleźć w Dsl\GeneratedCode\Diagrams.cs.

    W tej klasie diagramu musi zostać zastąpiona w ElementOperations do zwrócenia wystąpienia podklasa ElementOperations użytkownika.Powinien zwrócić tym samym wystąpieniu na każdym wywołaniu.

Dodaj ten kod w pliku kodu niestandardowego w projekcie DslPackage:

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
  }

Odbieranie elementów przeciągnąć z innych modeli

Umożliwia także ElementOperations do definiowania zachowania kopii, przenoszenie, usuwanie i przeciągania i upuszczania.Jako przeprowadzoną korzystania z ElementOperations w tym miejscu podanym przykładzie definiuje niestandardowe zachowanie przeciągania i upuszczania.Jednakże w tym celu należy rozważyć alternatywne podejście opisane w Porady: dodawanie obsługi przeciągania i upuszczania, który jest bardziej rozszerzalnych.

Zdefiniuj dwie metody w klasie ElementOperations:

  • CanMerge(ModelElement targetElement, System.Windows.Forms.IDataObject data)która określa, czy element źródła można przeciągnąć na docelowym kształtu, łącznik lub diagramu.

  • MergeElementGroupPrototype(ModelElement targetElement, ElementGroupPrototype sourcePrototype)element źródła która łączy do obiektu docelowego.

CanMerge()

CanMerge()jest wywoływane w celu określenia opinie, które należy nadać użytkownikowi zgodnie z ruchem myszy w schemacie.Parametry metody są element w odniesieniu do której wskaźnika myszy i dane o źródle, z którego została wykonana operacja przeciągania.Użytkownik przeciągnąć z dowolnego miejsca na ekranie.W związku z tym z obiektem źródłowym może być wiele różnych typów i może być Zserializowany w różnych formatach.Jeśli źródło jest modelem DSL lub UML, parametr danych jest serializacji ElementGroupPrototype.Za pomocą ElementGroupPrototypes operacji przeciągania, kopiowania i przybornika reprezentują fragmenty modeli.

Prototyp grupy Element może zawierać dowolną liczbę elementów i łącza.Typy elementów można zidentyfikować według ich identyfikatorów.Identyfikator GUID jest kształtu, który został przeciągnąć nie źródłowego elementu modelu.W poniższym przykładzie CanMerge() zwraca wartość true, jeśli kształt klasy z diagramu UML jest przeciągnąć na tym diagramie.

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()

Ta metoda jest wywoływana, gdy użytkownik spada elementu na diagramie, łącznik lub kształtu.Należy go scalić przeciąganego zawartości elementu docelowego.W tym przykładzie kod określa, czy rozpoznaje kombinacji typów docelowego i prototypu. Jeśli tak, metoda konwertuje przeciąganego elementy prototypu elementów, które mają zostać dodane do modelu.Podstawowa metoda jest wywoływana w celu wykonać scalanie, należy skonwertować lub nieprzekonwertowane elementów.

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

W tym przykładzie podano z elementami klasy UML przeciągnąć z diagramu UML klasy.DSL nie jest przeznaczony do przechowywania klas UML bezpośrednio, ale zamiast tego tworzymy element DSL dla każdego przeciąganego klasa UML.Powinien to być przydatne, na przykład, jeśli DSL jest diagramu wystąpienia.Użytkownik może przeciągnij klasy diagramu do tworzenia wystąpień tych klas.

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

Zachowanie kopia Standard

Kod w tej części przedstawiono metody, które można przesłonić w celu zmiany zachowania kopiowania.W tej sekcji zawiera kod, który zastępuje metody zajmujące się kopiowanie, aby ułatwić Państwu Zobacz, jak osiągnąć własne dostosowania, ale nie zmienia zachowanie standardowego.

Gdy użytkownik naciśnie klawisz CTRL + C lub używa kopii polecenie metodę ProcessOnMenuCopyCommand jest wywoływana.Możesz zobaczyć, jak to określono DslPackage\Generated Code\CommandSet.cs.Aby uzyskać więcej informacji dotyczących sposobu polecenia są ustawienia, zobacz Porady: dodawanie polecenia do menu skrótów.

Można zastąpić ProcessOnMenuCopyCommand przez dodanie definicji częściowej klasy MyDslClipboardCommandSet w projekcie DslPackage.

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

Każdy diagram ma pojedyncze wystąpienie elementu ElementOperations.Można podać własną zależnych.Tego pliku, który można umieścić w projekcie DSL, czy zachowują się tak samo jak kodu, który zastępuje ona:

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

Zobacz też

Koncepcje

Dostosowywanie tworzenia i przesuwania elementów

Porady: dodawanie obsługi przeciągania i upuszczania

Dostosowywanie zachowania dotyczącego usuwania

Inne zasoby

Próbki: Przykładowe diagramy obwód VMSDK