Добавление команд и жестов в схемы слоев

Можно определить команды контекстного меню и обработчики жестов на схемах слоев в Visual Studio Ultimate.Эти расширения можно упаковать в формат Visual Studio Integration Extension (VSIX) и предоставить их другим пользователям Visual Studio.

При необходимости в одном проекте Visual Studio можно определить несколько команд и обработчиков жестов.Кроме того, в одном VSIX-файле можно объединить несколько проектов.Например, можно определить один VSIX-файл, включающий команды слоя, доменный язык и команды для UML-схем.

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

Можно также настраивать проверку архитектуры, в которой исходный код пользователей сравнивается со схемами слоев.Проверку архитектуры следует определить в отдельном Visual Studio проекте.Его можно добавить в тот же VSIX-файл, в котором хранятся другие расширения.Дополнительные сведения см. в разделе Добавление пользовательской проверки архитектуры в схемы слоев.

Требования к созданию расширений слоев

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

  • Visual Studio Ultimate

  • Пакет Visual Studio SDK

  • Пакет SDK для визуализации данных и моделирования

Определение команды или жеста в новом VSIX-файле

Использование шаблона проекта — самый быстрый способ создания расширения.В этом случае код и VSIX-манифест размещаются в одном и том же проекте.

Определения расширения с использованием шаблона проекта

  1. Создайте проект в новом решении, воспользовавшись командой Создать проект в меню Файл.

  2. В диалоговом окне Создать проект в разделе Проекты моделирования выберите Расширение команд конструктора слоев или Расширение жестов конструктора слоев.

    Шаблон создает проект, который содержит небольшой рабочий пример.

  3. Чтобы протестировать расширение, нажмите сочетание клавиш CTRL+F5 или клавишу F5.

    Запустится экспериментальный экземпляр Visual Studio.Создайте схему слоев в этом экземпляре.Расширение команд или жестов должно работать на этой схеме.

  4. Закройте экспериментальный экземпляр и измените пример кода.Дополнительные сведения см. в разделе Перемещение по моделям слоев в коде программы и их обновление.

  5. Можно добавить в один проект несколько команд или обработчиков жестов.Дополнительные сведения см. в одном из следующих разделов:

    Определение команды меню

    Определение обработчика жестов

  6. Чтобы установить расширение в основном экземпляре Visual Studio или на другом компьютере, найдите файл .vsix в папке bin\*.Скопируйте его на компьютер, на котором его требуется установить, а затем дважды щелкните файл.Чтобы удалить его, выберите Диспетчер расширений в меню Сервис.

Добавление команды или жеста в отдельный VSIX-файл

Если требуется создать один VSIX-файл, который содержит команды, проверяющие элементы слоев и другие расширения, рекомендуется создать один проект для определения VSIX-файла и отдельный проект для обработчиков.Сведения о других типах расширения моделирования см. в разделе Расширение моделей и схем UML.

Добавление расширений слоев в отдельный VSIX-файл

  1. Создайте проект библиотеки классов в новом или имеющемся решении Visual Studio Ultimate.В диалоговом окне Создать проект последовательно щелкните элементы Visual C# и Библиотека классов.Данный проект содержит классы команд или обработчиков жестов.

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

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

  2. Определите или создайте в решении проект VSIX.Проект VSIX содержит файл с именем source.extension.vsixmanifest.Добавление проекта VSIX

    1. В диалоговом окне Создать проект разверните узел Visual C#, затем последовательно щелкните элементы Расширяемость и Проект VSIX.

    2. В обозревателе решений щелкните правой кнопкой мыши проект VSIX, затем выберите Назначить запускаемым проектом.

    3. Щелкните Выбрать выпуски и убедитесь, что Visual Studio Ultimate помечен флажком.

  3. В source.extension.vsixmanifest в разделе Активы добавьте проект команд или обработчиков жестов в качестве компонента MEF.

    1. На вкладке Активы выберите Создать.

    2. В списке Тип выберите Microsoft.VisualStudio.MefComponent.

    3. В списке Источник выберите Проект в текущем решении и выберите имя проекта команд или обработчиков жестов.

    4. Сохраните файл.

  4. Вернитесь в проект команд или обработчиков жестов и добавьте следующие ссылки на проект.

Ссылки

Возможности

Program Files\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Architecture Tools\ExtensibilityRuntime\Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dll

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

Microsoft.VisualStudio.Uml.Interfaces

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

Microsoft.VisualStudio.ArchitectureTools.Extensibility

Изменение фигур на схемах

System.ComponentModel.Composition

Определение компонентов с использованием Managed Extensibility Framework (MEF)

Microsoft.VisualStudio.Modeling.Sdk.11.0

Определение расширений моделирования

Microsoft.VisualStudio.Modeling.Sdk.Diagrams.11.0

Обновление фигур и схем

  1. Измените файл классов в проекте библиотеки классов C# таким образом, чтобы он содержал код расширения.Дополнительные сведения см. в одном из следующих разделов:

    Определение команды меню

    Определение обработчика жестов

    См. также раздел Перемещение по моделям слоев в коде программы и их обновление.

  2. Для тестирования этой функции, нажмите сочетание клавиш CTRL+F5 или клавишу F5.Откроется экспериментальный экземпляр Visual Studio.Создайте или откройте схему слоев в этом экземпляре.

  3. Чтобы установить VSIX в главном экземпляре Visual Studio или на другом компьютере, найдите файл .vsix в каталоге bin проекта VSIX.Скопируйте его на компьютер, на котором требуется установить VSIX.Дважды щелкните файл VSIX в проводнике.

    Чтобы удалить его, выберите Диспетчер расширений в меню Сервис.

Определение команды меню

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

  • Класс объявляется следующим образом:

    [LayerDesignerExtension]

    [Export(typeof(ICommandExtension))]

    public class моя_команда_слоя : ICommandExtension { ... }

  • Пространство имен и имя класса не имеют значения.

  • ICommandExtension реализуют следующие методы:

    • string Text {get;} — ярлык, который отображается в меню.

    • void QueryStatus(IMenuCommand command) — вызывается, когда пользователь щелкает схему правой кнопкой мыши и выбирает, должна ли команда быть видимой и включенной для текущего выделения.

    • void Execute(IMenuCommand command) — вызывается, когда пользователь выбирает команду.

  • Для определения текущего выделения можно импортировать IDiagramContext:

    [Import]

    public IDiagramContext DiagramContext { get; set; }

    ...

    DiagramContext.CurrentDiagram.SelectedShapes.Count()...

Дополнительные сведения см. в разделе Перемещение по моделям слоев в коде программы и их обновление.

Чтобы добавить новую команду, создайте новый файл кода со следующим примером.Затем протестируйте и отредактируйте его.

using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
using Microsoft.VisualStudio.Modeling.Diagrams.ExtensionEnablement;
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
using System.ComponentModel.Composition;
using System.Linq;

namespace MyLayerExtension // Change to your preference.
{
  // This is a feature for Layer diagrams:
  [LayerDesignerExtension]
  // This feature is a menu command:
  [Export(typeof(ICommandExtension))]
  // Change the class name to your preference:
  public class MyLayerCommand : ICommandExtension
  {
    [Import]
    public IDiagramContext DiagramContext { get; set; }

    [Import]
    public ILinkedUndoContext LinkedUndoContext { get; set; }

    // Menu command label:
    public string Text
    {
      get { return "Duplicate layers"; }
    }

    // Called when the user right-clicks the diagram.
    // Defines whether the command is visible and enabled.
    public void QueryStatus(IMenuCommand command)
    { 
      command.Visible = 
      command.Enabled = DiagramContext.CurrentDiagram
        .SelectedShapes.Count() > 0;
    }

    // Called when the user selects the command.
    public void Execute(IMenuCommand command)
    {
      // A selection of starting points:
      IDiagram diagram = this.DiagramContext.CurrentDiagram;
      ILayerModel lmodel = diagram.GetLayerModel();
      foreach (ILayer layer in lmodel.Layers)
      { // All layers in model.
      }
      // Updates should be performed in a transaction:
      using (ILinkedUndoTransaction t =
        LinkedUndoContext.BeginTransaction("copy selection"))
      {
        foreach (ILayer layer in 
          diagram.SelectedShapes
            .Select(shape=>shape.GetLayerElement())
            .Where(element => element is ILayer))
        {
          ILayer copy = lmodel.CreateLayer(layer.Name + "+");
          // Position the shapes:
          IShape originalShape = layer.GetShape();
          copy.GetShape().Move(
            originalShape.XPosition + originalShape.Width * 1.2,
            originalShape.YPosition);
        }
        t.Commit();
      }
    }
  }
}

Определение обработчика жестов

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

В существующий проект VSIX команд или обработчиков жестов можно добавить файл кода, определяющий обработчик жестов:

using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
using Microsoft.VisualStudio.Modeling.Diagrams.ExtensionEnablement;
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
using System.ComponentModel.Composition;
using System.Linq;
namespace MyLayerExtensions // change to your preference
{
  [LayerDesignerExtension]
  [Export(typeof(IGestureExtension))]
  public class MyLayerGestureHandler : IGestureExtension
  {
  }
}

Обратите внимание на следующие моменты, касающиеся обработчиков жестов:

  • Расширение IGestureExtension содержит следующие члены:

    OnDoubleClick — вызывается при двойном щелчке в любом месте схемы.

    CanDragDrop — вызывается многократно при перемещении мыши во время перетаскивания элемента на схему.Нужно перемещать мышь быстро.

    OnDragDrop — вызывается при опускании объекта на схему.

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

            public void OnDragDrop(IShape target, IDataObject data)
            {
                ILayerElement element = target.GetLayerElement();
                if (element is ILayer)
                {
                    // ...
                }
            }
    
  • Обработчики для некоторых типов перетащенных элементов уже определены.Например, пользователь может перетащить элементы из обозревателя решений на схему слоев.Для этих типов элементов невозможно определить обработчик перетаскивания.В этих случаях методы DragDrop не вызываются.

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

См. также

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

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

Добавление пользовательской проверки архитектуры в схемы слоев

Практическое руководство. Определение и установка расширения моделирования