Поделиться через


Настройка создания и перемещения элементов

Можно разрешить элемент, который необходимо перетащить на другую или из области элементов или в операции " вставить " или move.Можно использовать перемесщенные элементы, связанные с элементами целевого объекта в связи.

Директива слияния элементов (EMD) указывает на то, что происходит, когда один элемент модели объединенное в другой элемент модели.Это происходит, когда:

  • Пользователь перетаскивает из панели элементов на схему или форму.

  • Пользователь создает элемент с помощью меню добавить в обозревателе или фигуре секции.

  • Пользователь перемещает элемент из одной прокрутки на другой.

  • Пользователь вставляет элемент.

  • Пользовательский программный код вызывает директиву слияния элемента.

Хотя операции создания может показаться, что отличили операции копирования, они фактически работает таким же образом.При добавлении элемента, например из панели элементов будет реплицирован заполнитель.Заполнитель объединяется в модель точно так же, как и элементы, которые были скопированы из другой части модели.

Ответственность за EMD решить, как объект или группа в составе объекты должны быть объединены в указанное расположение в модели.В частности, он принимает решение о том, какие связи должны создаваться для связывания объединенную группа в модели.Можно также настраивать для задания свойств и создание дополнительных объектов.

Роль директивы слияния элементов

DSL-EMD_Merge

EMD создается автоматически при определении внедрения связь.Это значение по умолчанию EMD создает экземпляр связи, когда пользователи добавляют новые экземпляры дочернего элемента на родительский объект.Можно изменить эти EMDs по умолчанию, например, добавить пользовательский код.

Можно также добавлять собственные EMDs в определении DSL, чтобы позволить пользователям перетаскивать или вставить другие сочетания слияния и получить классы.

Задание директивы слияния элементов

Можно добавить директивы слияния элементов к доменным классам, доменным связи фигурам, соединителям и схемы.Можно добавлять или найти в обозревателе DSL в принимающее доменным классом.При получении класс доменный класс элемента, который уже находится в модели, и на которые будет объединяется новый или копируемый элемент.

DSL-EMD_Details

Класс индексирования доменный класс элементов, которые можно объединить в элементы при получении класса.Экземплярах подклассов класса индексирования также будут объединены этим EMD, если не устанавливать Применяется к подклассам значение false.

2 Типа директивы слияния:

  • A Слияние процесса. директива определяет связи, новый элемент должен быть связан в дерево.

  • A Front слияние директива перенаправляет нового элемента к другому элементу, обычно при получении элементом.

Можно добавить пользовательский код к предоставлению слияния:

  • Установка Принять вариант использует пользовательский интерфейс добавить собственный код, чтобы определить, следует ли указанный экземпляр элемента индексирования быть объединяется в элемент целевого объекта.При перетаскивании пользователем из области элементов", "недопустимый указатель указывает если код запрещает слияние.

    Например, можно разрешить слияние, только когда принимающая элемент в указанном состоянии.

  • Установка Использует пользовательское слияние чтобы добавить укажите собственный код, чтобы определить изменения, внесенные в модель, если слияние выполняется.

    Например, можно задать свойства в объединенном элементе с помощью данных из нового местоположения в модели.

ПримечаниеПримечание

При написании пользовательского кода слияния, то оно влияет только на слияния, выполняемые с помощью этого EMD.Если другое EMDs, объединят тот же тип объекта или другой пользовательский код, который создает эти объекты без использования EMD, то они не будут затронуты пользовательским кодом слияния.

Если необходимо убедиться в том, что новый элемент или создать связь, всегда обрабатываются вашим пользовательским кодом, рассмотрим определение AddRule в отношении внедрения и a DeleteRule на доменном классе элемента.Дополнительные сведения см. в разделе Правила распространяют изменения в пределах модели.

Пример: Определение EMD без пользовательского кода

В следующем примере позволяет пользователям создать элемент и соединитель одновременно путем перетаскивания из панели элементов на существующую форму.Пример добавляет EMD к определению DSL.Перед этим изменением, пользователи могут перетаскивать средств на схему, но не на существующие формы.

Также пользователи могут вставить элементы на другие элементы.

Разрешить пользователю создание элемента и соединитель одновременно

  1. Создайте новый DSL с помощью Минимальный язык шаблон решения.

    При выполнении этого DSL, оно позволяет создать фигур и соединителей между фигурами.Нельзя перетаскивать новой ExampleElement фигуры из панели элементов на существующую форму.

  2. Разрешить пользователям слияние элементы ExampleElement фигуры, создают новый EMD в ExampleElement доменный класс.

    1. IN Обозреватель DSLразверните Классы доменных.Щелкните правой кнопкой мыши ExampleElement затем перейдите Добавьте новую директиву слияния элементов.

    2. Убедитесь, что Сведения DSL окно открыто, так что можно увидеть данные нового EMD.(Меню: Просмотреть" Другие окна" Сведения DSL.)

  3. Установка Класс индексирования в окне подробности DSL, чтобы определить, какой класс элементов может быть на объединенное ExampleElement объекты.

    Для этого примера выберите ExampleElements, чтобы пользователь мог перетаскивая новые элементы на существующие элементы.

    Обратите внимание, что класс индексирования будет именем EMD в обозревателе DSL.

  4. Под Процесс слияния путем создания связидобавьте 2 пути:

    1. Один путь связывает новый элемент с родительской модели.Выражение пути, нужно ввести переходит из существующего элемента вверх до внедрения отношению к родительской модели.Наконец, он определяет роль в новой ссылки на которой будет присвоен новый элемент.Путь к следующим образом:

      ExampleModelHasElements.ExampleModel/!ExampleModel/.Elements

    2. Другой путь связывает новый элемент на существующий элемент.Выражение пути задает отношение ссылки и роли, к которому будет присвоен новый элемент.Этот путь выглядит следующим образом:

      ExampleElementReferencesTargets.Sources

    Можно использовать средство навигации пути для создания каждый путь:

    1. Под Процесс слияния с создания ссылки на путяхщелкните <добавьте путь>.

    2. Щелкните стрелку раскрывающегося меню справа от элемента списка.Представление в виде дерева.

    3. Разверните узлы в дереве для формирования путь, который необходимо задать.

  5. Проверьте DSL:

    1. Нажмите клавишу F5 для перестроения и выполняется решение.

      Перестроение примет больше времени, чем обычно происходит потому, что созданный код будет обновлен из текстовых шаблонов, чтобы соответствовать новому определению DSL.

    2. В экспериментальном экземпляре Visual Studio запускает, откройте файл проекта модели DSL.Создайте некоторые элементы примера.

    3. Перетащите из Элемент примера средство на существующую форму.

      Новая фигура, и она связана с существующей фигуры с соединителем.

    4. Скопируйте существующую форму.Выберите другую форму и вставьте.

      Копия первой формы.Она имеет новое имя и она связана с другой фигуры с соединителем.

Обратите внимание на следующие элементы из данной процедуры.

  • Путем создания правила слияния элементов, можно разрешить любой класс элемента, чтобы принимать любое другое.Создается при получении EMD в доменном классе, а класс определен в обслуживаемого домена Класс индекса поле.

  • Указывая путь, можно указать, что ссылки должно быть использовано для подключения новый элемент в существующую модель.

    Задаваемые ссылки должны содержать одно внедрения связь.

  • EMD затрагивает и создание из области элементов и вставляет операции.

    При написании пользовательского кода, создающего новые элементы можно явно вызывать с помощью EMD ElementOperations.Merge метод.Это гарантирует, что код связывает новые элементы в модели точно так же, как другие операции.Дополнительные сведения см. в разделе Настройка функции копирования.

Пример: Добавление пользовательских примите код в EMD

Путем добавления пользовательского кода в EMD можно задать более сложная расширения функциональности слияния.Этот простой пример запрещает пользователю на добавление более фиксированное число элементов в схеме.Примере изменяется значение по умолчанию EMD, сопровождающий внедрения связь.

Чтобы создать пользовательский примите код, чтобы ограничить, что пользователь может добавлять

  1. Создайте DSL с помощью Минимальный язык шаблон решения.Откройте схему определения DSL.

  2. Разверните в обозревателе DSL Классы доменных" ExampleModel" Директивы слияния элементов.Выберите директива слияния элемента, которая называется ExampleElement.

    Управления данного EMD как пользователь может создать новую ExampleElement объекты модели, например путем перетаскивания из панели элементов.

  3. в Сведения DSL окно, выберите элемент Принять вариант использует пользовательский интерфейс.

  4. Вновь Выполните сборку решения.Вступит больше времени, чем обычно это происходит потому, что созданный код будет обновлен из модели.

    Будет возвращается ошибка построения, аналогично: "Company.ElementMergeSample.ExampleElement не содержит определение CanMergeExampleElement…"

    Необходимо реализовывать метод CanMergeExampleElement.

  5. Создайте новый файл кода в DSL этот проект.Замените его содержимое следующим кодом и измените пространство имен на пространство имен проекта.

    using Microsoft.VisualStudio.Modeling;
    
    namespace Company.ElementMergeSample // EDIT.
    {
      partial class ExampleModel
      {
        /// <summary>
        /// Called whenever an ExampleElement is to be merged into this ExampleModel.
        /// This happens when the user pastes an ExampleElement
        /// or drags from the toolbox.
        /// Determines whether the merge is allowed.
        /// </summary>
        /// <param name="rootElement">The root element in the merging EGP.</param>
        /// <param name="elementGroupPrototype">The EGP that the user wants to merge.</param>
        /// <returns>True if the merge is allowed</returns>
        private bool CanMergeExampleElement(ProtoElementBase rootElement, ElementGroupPrototype elementGroupPrototype)
        {
          // Allow no more than 4 elements to be added:
          return this.Elements.Count < 4;
        }
      }
    }
    

    Этот простой пример ограничивает число элементов, которые можно объединить в модель родительского элемента.Для получения интересующих условий метод может проверять все свойства и связи при получении объекта.Он также может проверять свойства при слиянии элементов, которые снесенное in a ElementGroupPrototype.Дополнительные сведения о ElementGroupPrototypes см. в разделе Настройка функции копирования.Дополнительные сведения о том, как написать код, который считывает модели см. в разделе Перемещение по модели и обновление модели в коде программы.

  6. Проверьте DSL:

    1. Нажмите клавишу F5 перестроить решение.В экспериментальном экземпляре Visual Studio открытые, открывает экземпляр DSL.

    2. Создание новых элементов несколькими способами.

      1. Перетащите из Элемент примера средство на схему.

      2. в Пример обозреватель моделищелкните правой кнопкой мыши корневой узел и выберите команду Добавьте новый элемент примера.

      3. Скопируйте и вставьте элемент на схеме.

    3. Убедитесь в том, что невозможно использовать любые из этих способов добавления более 4 элементов в модели.Это происходит потому, что они все использование директивы слияния элемента.

Пример: Добавление пользовательского кода слияния в EMD

В пользовательском коде слияния, можно указать, что происходит, когда пользователь перетаскивает средство или вставляет в элемент.2 Способа определить пользовательское слияния:

  1. Установка Использует пользовательское слияние и предоставьте необходимый код.Код заменяет созданный код слияния.Используйте этот параметр, если требуется полностью redefine, что слияние.

  2. Переопределите MergeRelate метод и дополнительно MergeDisconnect метод.Чтобы сделать это, необходимо установить Создает производный тип double свойство доменного класса.Код может вызвать созданный код слияния в базовом классе.Используйте этот параметр, если необходимо выполнить дополнительные операции, после того как было выполнено слияние.

Эти слияния, влияют на подходов, которые выполняются только с помощью этого EMD.Если требуется повлиять на все методы, в которых объединенный элемент можно создать альтернативный вариант указать, AddRule в отношении внедрения и a DeleteRule в объединенном доменном классе.Дополнительные сведения см. в разделе Правила распространяют изменения в пределах модели.

Переопределение MergeRelate

  1. В определении DSL, убедитесь, что вы определили EMD, к которому необходимо добавить код.При необходимости можно добавлять пути и определения пользовательских примите код, как описано на предыдущих шагах.

  2. В схеме DslDefinition выберите принимающее класс слияния.Обычно класс в конце источника внедрения связи.

    Например, в языке DSL создаваемый из решения, выберите минимальный ExampleModel.

  3. в Свойства окно, набор Создает производный тип double В true.

  4. Вновь Выполните сборку решения.

  5. Проверьте содержимое Dsl\Generated Files\DomainClasses.cs.Поиск именованных методов MergeRelate и просмотрите их содержимое.Это поможет создавать собственные версии.

  6. В новом файле кода, создайте разделяемый класс для класса, получающая и переопределите MergeRelate метод.Не забудьте вызвать базовый метод.Примеры.

      partial class ExampleModel
      {
        /// <summary>
        /// Called when the user drags or pastes an ExampleElement onto the diagram.
        /// Sets the time of day as the name.
        /// </summary>
        /// <param name="sourceElement">Element to be added</param>
        /// <param name="elementGroup">Elements to be merged</param>
        protected override void MergeRelate(ModelElement sourceElement, ElementGroup elementGroup)
        {
          // Connect the element according to the EMD:
          base.MergeRelate(sourceElement, elementGroup);
    
          // Custom actions: 
          ExampleElement mergingElement = sourceElement as ExampleElement;
          if (mergingElement != null)
          {
            mergingElement.Name = DateTime.Now.ToLongTimeString();
          }
        }
      }
    

Написать пользовательский код слияния

  1. IN Dsl\Generated Code\DomainClasses.csпроверьте именованные методы MergeRelate.Эти методы создают связи между новым элементом и существующей модели.

    Также проверьте именованные методы MergeDisconnect.Удаление ссылки этих методов элемента из модели, когда он удален.

  2. IN Обозреватель DSLвыберите или создайте директиву слияния элемента, которую необходимо настраивать.в Сведения DSL окно, набор Использует пользовательское слияние.

    Установите этот параметр, если Слияние процесса. и Front слияние параметры игнорируются.Код вместо него используется.

  3. Вновь Выполните сборку решения.Он принимает больше времени, чем обычно, поскольку создаваемые файлы кода будут обновлены из модели.

    Сообщения об ошибках отображаются.Дважды щелкните сообщение об ошибке для просмотра инструкций в сгенерированном коде.Эти инструкции запросить, чтобы указать метод, 2 MergeRelateYourDomainClass и MergeDisconnectYourDomainClass

  4. Создайте методы в определение разделяемого класса в отдельном файле кода.Примеры проверили ранее вы должны обеспечить, что требуется.

Пользовательский код слияния не влияет на код, который создает объекты непосредственно и связей, и он не оказывает влияния на другие EMDs.Чтобы убедиться в том, что дополнительные изменения реализуются независимо от того, как элемент создается, рассмотрим записи AddRule и a DeleteRule вместо этого.Дополнительные сведения см. в разделе Правила распространяют изменения в пределах модели.

Перенаправлять операцию слияния

Передняя директива слияния перенаправляет целевым объектом операции слияния.Обычно новый целевой объект содержит родительский начального целевого объекта.

Например, в DSL, который был создан с помощью шаблона схемы компонентов, портов внедрены в компонентах.Порты отображаются в виде мелких компонентов фигур на краю формы.Пользователь создает порты, перетащив средство порта на форму компонентов.Однако иногда пользователь по ошибке перетащите инструмент порта на существующий порт, вместо компонента и происходит сбой операции.Это ним ошибка, если несколько существующих портов.Чтобы помочь пользователю избежать этой досада можно включить порты, которые необходимо перетащить на существующий порт, но необходимое действие перенаправленную в родительский компонент.Операция работает, если целевой объект был компонентом.

Можно создать передняя директива слияния в решении моделей компонентов.При компилировании и выполните исходный решение, вы должны увидеть, что пользователи могут перетаскивать любое количество Порт ввода OR Порт выввода элементы Панель элементов к a Компонент элемент.Однако они не могут перетаскивать порт к существующему порт.Отсутствует указатель предупреждения они, что это движение не включено.Однако можно создать передняя директива слияния, так что порт, непреднамеренно удален на существовать Порт ввода в переадресует Компонент элемент.

Создание передняя директива слияния

  1. Create a Инструменты DSL решение с использованием модели компонентов шаблона.

  2. Показать Обозреватель DSL путем открытия DslDefinition.dsl.

  3. в Обозреватель DSLразверните Классы доменных.

  4. ComponentPort доменный класс является абстрактным базовым классом обоих InPort и OutPort.Щелкните правой кнопкой мыши ComponentPort затем перейдите Добавьте новую директиву слияния элементов.

    Создать Директива слияния элементов узел отображается под Директивы слияния элементов узел.

  5. Выберите Директива слияния элементов узел и открытие Сведения DSL окна.

  6. В списке выбор класса индексирования ComponentPort.

  7. Выберите Front слияние к другому доменному класс.

  8. В списке выбора пути, ComponentPortразверните ComponentHasPorts, а затем выберите Компонент.

    Новый путь должен выглядеть примерно следующим образом одно:

    ComponentHasPorts.Component/! Компонент

  9. Сохраните решение, а затем преобразование шаблоны, щелкнув правой кнопки Обозреватель решений панель инструментов.

  10. Постройте и запустите это решение.Новый экземпляр Visual Studio отображается.

  11. IN Обозреватель решенийвыберите команду открыть Sample.mydsl.Схема и Панель элементов ComponentLanguage отображаются.

  12. Перетащите Порт ввода от Панель элементов к другим Порт ввода. Затем перетащите OutputPort к InputPort затем в другой OutputPort.

    Нет необходимости видеть отсутствует указатель, который необходимо иметь возможность удаления новой Порт ввода в качестве основы.Выберите новую Порт ввода и перетащите его в другое точки Компонент.

См. также

Основные понятия

Перемещение по модели и обновление модели в коде программы

Настройка элементов и панели элементов

Другие ресурсы

Образец DSL принципиальных схем