在圖層圖表中加入命令和軌跡

您可以在處理常式圖層圖表上的 Visual Studio Ultimate定義內容功能表命令和筆勢。您可以將這些擴充功能封裝成 Visual Studio Integration Extension (VSIX),以便散發給其他 Visual Studio 使用者。

您可以視需要在相同的 Visual Studio 專案中定義許多命令和筆勢處理常式。您也可以將許多這類專案結合成單一 VSIX。例如,您可以定義單一 VSIX,其中包含圖層命令、網域指定的語言以及 UML 圖表的命令。

注意事項注意事項

您也可以自訂架構驗證讓使用者原始程式碼與圖層圖表進行比較。您應該定義位於另一個 Visual Studio 專案的架構驗證。 您可以將它與其他擴充功能加入至相同的 VSIX。如需詳細資訊,請參閱在圖層圖表中加入自訂架構驗證

撰寫圖層擴充功能的需求

您必須在想要用來開發圖層擴充功能的電腦上安裝下列元件:

  • Visual Studio Ultimate

  • Visual Studio SDK

  • Visualization and Modeling SDK

在新的 VSIX 中定義命令或筆勢

建立擴充功能最快速的方法是使用專案範本。這樣做會將程式碼和 VSIX 資訊清單放入相同的專案中。

若要使用專案範本定義擴充功能

  1. 使用 [檔案] 功能表上的 [新增專案] 命令,在新的方案中建立專案。

  2. 在 [新增專案] 對話方塊的 [模型專案] 底下,選取 [Layer Designer Command Extension] (圖層設計工具命令擴充功能) 或 [Layer Designer Gesture Extension] (圖層設計工具筆勢擴充功能)。

    此範本就會建立包含小型工作範例的專案。

  3. 若要測試擴充功能,請按下 CTRL+F5F5

    Visual Studio 的實驗執行個體隨即啟動。在此執行個體中,建立圖層圖表。您的命令或筆勢擴充功能應該會在此圖表中運作。

  4. 關閉實驗執行個體並修改範例程式碼。如需詳細資訊,請參閱巡覽及更新程式碼中的圖層模型

  5. 您可以將其他命令或筆勢處理常式加入至相同的專案。如需詳細資訊,請參閱下列其中一節:

    定義功能表命令

    定義筆勢處理常式

  6. 若要在 Visual Studio 的主要執行個體或其他電腦上安裝擴充功能,請在 bin\* 中尋找 .vsix 檔案。將它複製到您想要安裝的目標電腦,然後按兩下該檔案。若要解除安裝此元件,請使用 [工具] 功能表上的 [擴充管理員]。

將命令或筆勢加入至個別 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. 按一下 [Select Editions] (選取版本) 並確定已核取 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. 若要在 Visual Studio 的主要執行個體或其他電腦上安裝 VSIX,請在 VSIX 專案的 bin 目錄中尋找 .vsix 檔案。將它複製到您想要安裝 VSIX 的目標電腦。按兩下 [Windows 檔案總管] 中的VSIX 檔案(Windows8中的檔案管理 )。

    若要解除安裝此元件,請使用 [工具] 功能表上的 [擴充管理員]。

定義功能表命令

您可以將其他功能表命令定義加入至現有的筆勢或命令專案。每個命令都由具有下列特性的類別加以定義:

  • 類別的宣告方式如下:

    [LayerDesignerExtension]

    [Export(typeof(ICommandExtension))]

    public class MyLayerCommand : 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 方法。

如需如何在其他項目拖曳至圖表上時進行解碼的詳細資訊,請參閱HOW TO:在模型圖表上定義筆勢處理常式

請參閱

概念

巡覽及更新程式碼中的圖層模型

在圖層圖表中加入自訂架構驗證

HOW TO:定義與安裝模型擴充功能