次の方法で共有


レイヤー図へのコマンドおよびジェスチャの追加

更新 : 2010 年 12 月

この Visual Studio 2010 Feature Pack を使用すると、ショートカット メニュー (コンテキスト メニュー) コマンドおよびジェスチャ ハンドラーを定義することで、Visual Studio 2010 Ultimate のレイヤー図を拡張できます。 これらの拡張機能を Visual Studio Integration Extension (VSIX) にパッケージ化し、他の Visual Studio Ultimate ユーザーに配布できます。 詳細については、「Visual Studio Feature Pack」を参照してください。

必要に応じて、複数のコマンドおよびジェスチャ ハンドラーを同じ Visual Studio プロジェクトで定義できます。 また、複数のプロジェクトを組み合わせて 1 つの VSIX に含めることもできます。 たとえば、レイヤー コマンド、特定領域言語、および UML 図用のコマンドを含む単一の VSIX を定義できます。

注意

カスタム アーキテクチャ検証メソッドを定義する場合は、別の Visual Studio プロジェクトで定義する必要があります。 それを他の拡張機能と同じ VSIX に追加できます。 詳細については、「レイヤー図へのカスタム アーキテクチャ検証の追加」を参照してください。

要件

要件およびインストール方法については、「レイヤー図に関する拡張機能の作成」の「要件」を参照してください。

新しい VSIX でコマンドまたはジェスチャを定義する

最も簡単に拡張機能を作成するには、プロジェクト テンプレートを使用します。 この方法では、コードと VSIX マニフェストが同じプロジェクトに配置されます。

プロジェクト テンプレートを使用して拡張機能を定義するには

  1. [ファイル] メニューの [新しいプロジェクト] を使用して、新しいソリューションにプロジェクトを作成します。

  2. [新しいプロジェクト] ダイアログ ボックスの [モデリング プロジェクト] で、[Layer Designer Command Extension] (レイヤー デザイナー コマンド拡張機能) または [Layer Designer Gesture Extension] (レイヤー デザイナー ジェスチャ拡張機能) を選択します。

    このテンプレートでは、動作する小さい例を含むプロジェクトが作成されます。

  3. 拡張機能をテストするには、Ctrl キーを押しながら F5 キーを押すか、F5 キーを押します。

    Visual Studio の実験用のインスタンスが開始します。 このインスタンスで、レイヤー図を作成します。 独自のコマンドまたはジェスチャ拡張機能が、この図で動作します。

  4. 実験用のインスタンスを閉じて、サンプル コードを変更します。 詳細については、「プログラム コードにおけるレイヤー モデル内の移動およびレイヤー モデルの更新」を参照してください。

  5. 同じプロジェクトに、さらにコマンドまたはジェスチャ ハンドラーを追加できます。 詳細については、以下のセクションを参照してください。

    メニュー コマンドを定義する

    ジェスチャ ハンドラーを定義する

  6. Visual Studio のメイン インスタンスまたは別のコンピューターに拡張機能をインストールするには、bin\*.vsix ファイルを探します。 このファイルをインストール先のコンピューターにコピーして、ダブルクリックします。 拡張機能をアンインストールするには、[ツール] メニューの [拡張機能マネージャー] を使用します。

別の VSIX にコマンドまたはジェスチャを追加する

コマンド、レイヤー検証コントロール、および他の拡張機能を含む 1 つの VSIX を作成する場合は、VSIX を定義するプロジェクトとハンドラー用のプロジェクトを分けることをお勧めします。 他の種類のモデリング拡張機能については、「UML モデルと図の拡張」を参照してください。

レイヤー拡張機能を別の VSIX に追加するには

  1. 新規または既存の Visual Studio Ultimate ソリューションでクラス ライブラリ プロジェクトを作成します。 [新しいプロジェクト] ダイアログ ボックスで、[Visual C#] をクリックし、[クラス ライブラリ] をクリックします。 このプロジェクトに、コマンドまたはジェスチャ ハンドラーのクラスを格納します。

    注意

    コマンドまたはジェスチャ ハンドラーのクラスは 1 つのクラス ライブラリに複数定義できますが、レイヤー検証クラスは別のクラス ライブラリで定義する必要があります。

  2. ソリューションで VSIX プロジェクトを特定または作成します。 VSIX プロジェクトには、source.extension.vsixmanifest という名前のファイルが含まれます。 VSIX プロジェクトを追加するには:

    1. [新しいプロジェクト] ダイアログ ボックスで [Visual C#] を展開し、[拡張機能] をクリックして [VSIX Project] (VSIX プロジェクト) をクリックします。

    2. ソリューション エクスプローラーで、VSIX プロジェクトを右クリックし、[スタートアップ プロジェクトに設定] をクリックします。

    3. [Select Editions] (エディションの選択) をクリックし、Visual Studio Ultimate がオンになっていることを確認します。

  3. source.extension.vsixmanifest[コンテンツ] で、コマンドまたはジェスチャ ハンドラーのプロジェクトを MEF コンポーネントとして追加します。

    1. [コンテンツの追加] をクリックします。

    2. [コンテンツ タイプの選択] で、[MEF コンポーネント] を選択します。

    3. [Select a source] (ソースの選択) で、[プロジェクト] をクリックし、コマンドまたはジェスチャ ハンドラーのプロジェクトの名前を選択します。

    4. ファイルを保存します。

  4. [参照][参照の追加] をクリックし、この Feature Pack のランタイムを選択します。

  5. コマンドまたはジェスチャ ハンドラーのプロジェクトに戻り、以下のプロジェクト参照を追加します。

参照

実行できる操作

Visual Studio 2010 Visualization and Modeling Feature Pack がインストールされている場合:

%LocalAppData%\Microsoft\VisualStudio\10.0\Extensions\Microsoft\Visualization and Modeling Feature Pack Runtime\1.0\Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dll

メモメモ
%LocalAppData% は、通常は <ドライブ名>:\Users\<ユーザー名>\AppData\Local です。Windows XP または Windows 2003 では、%LocalAppData% の代わりに %AppData% を使用します。

Visual Studio 2010 Feature Pack 2 がインストールされている場合:

...\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Visualization and Modeling Feature Pack Runtime\1.0\Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dll

レイヤーを作成および編集する

Microsoft.VisualStudio.Uml.Interfaces

レイヤーを作成および編集する

Microsoft.VisualStudio.ArchitectureTools.Extensibility

図の図形を変更する

System.ComponentModel.Composition

MEF (Managed Extensibility Framework) を使用してコンポーネントを定義する

Microsoft.VisualStudio.Modeling.Sdk.10.0

モデリング拡張機能を定義する

Microsoft.VisualStudio.Modeling.Sdk.Diagrams.10.0

図形と図を更新する

  1. 拡張機能のコードを含むように、C# クラス ライブラリ プロジェクトのクラス ファイルを編集します。 詳細については、以下のセクションを参照してください。

    メニュー コマンドを定義する

    ジェスチャ ハンドラーを定義する

    プログラム コードにおけるレイヤー モデル内の移動およびレイヤー モデルの更新」も参照してください。

  2. 機能をテストするには、Ctrl キーを押しながら F5 キーを押すか、または F5 キーを押します。 Visual Studio の実験用のインスタンスが開きます。 このインスタンスで、レイヤー図を作成または開きます。

  3. Visual Studio のメイン インスタンスまたは別のコンピューターに VSIX をインストールするには、VSIX プロジェクトの bin ディレクトリで .vsix ファイルを探します。 このファイルを、VSIX をインストールするコンピューターにコピーします。 Windows エクスプローラーで、VSIX ファイルをダブルクリックします。

    拡張機能をアンインストールするには、[ツール] メニューの [拡張機能マネージャー] を使用します。

メニュー コマンドを定義する

ジェスチャまたはコマンドの既存のプロジェクトに、さらにメニュー コマンド定義を追加できます。 各コマンドは、次のような特徴を持つクラスによって定義されます。

  • クラスは次のように宣言されます。

    [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.ArchitectureTools.Extensibility.Uml; 
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.ArchitectureTools.Extensibility.Uml;
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: ユーザーが図にアイテムをドロップすると呼び出されます。

  • 各メソッドに対する 1 番目の引数は ShapeElement です。 これを IShape に変換できます。モデリング用のラッパーとしてはこの方が便利です。

    IShape ishape = targetElement.CreateIShape();
    if (ishape is IDiagram) { ... }
    else { ILayerElement layerElement = s.GetLayerElement(); ... }
    
  • ドラッグされるアイテムの種類によっては、ハンドラーが既に定義されています。 たとえば、ユーザーはソリューション エクスプローラーからレイヤー図にアイテムをドラッグできます。 このような種類のアイテムに対しては、ドラッグ ハンドラーを定義できません。 その場合、DragDrop メソッドは呼び出されません。

他のアイテムが図にドラッグされるときにアイテムをデコードする方法の詳細については、「方法: モデリング図にドロップおよびダブルクリック ハンドラーを定義する」を参照してください。

参照

その他の技術情報

プログラム コードにおけるレイヤー モデル内の移動およびレイヤー モデルの更新

レイヤー図へのカスタム アーキテクチャ検証の追加

方法: モデリング拡張機能を定義およびインストールする

履歴の変更

日付

履歴

理由

2010 年 12 月

Visual Studio 2010 Feature Pack 2 用に更新。

情報の拡充