次の方法で共有


方法: ドメイン固有言語における標準のメニュー コマンドを修正する

DSL で自動的に定義される標準コマンドのいくつかの動作を変更できます。 たとえば、[切り取り] を変更して、重要情報を除外することができます。 そのためには、コマンド セット クラス内でメソッドをオーバーライドします。 これらのクラスは DslPackage プロジェクト内の CommandSet.cs ファイルで定義され、CommandSet から派生します。

要約すると、コマンドを変更するには以下の操作を実行します。

  1. 変更するコマンドを発見します。

  2. 適切なコマンド セット クラスの部分宣言を作成します。

  3. コマンドの ProcessOnStatus メソッドおよび ProcessOnMenu メソッドをオーバーライドします。

このトピックではこの手順を説明します。

注意

独自のメニュー コマンドを作成する場合は、「方法: ショートカット メニューにコマンドを追加する」を参照してください。

変更可能なコマンド

変更可能なコマンドを見つけるには

  1. DslPackage プロジェクトで、GeneratedCode\CommandSet.cs を開きます。 この C# ファイルは、ソリューション エクスプローラー内で、CommandSet.tt の従属として見つけることができます。

  2. このファイル内のクラスで、名前が "CommandSet" で終わるもの、たとえば Language1CommandSet や Language1ClipboardCommandSet などを見つけます。

  3. 各コマンド セット クラスで、"override" とその後に続けて空白文字を 1 つ入力します。 IntelliSense ではオーバーライド可能なメソッドの一覧が表示されます。 各コマンドには名前が "ProcessOnStatus" および "ProcessOnMenu" で始まるメソッドのペアが含まれます。

  4. 変更するコマンドを含むコマンド セット クラスをメモします。

  5. 編集内容を保存せずにファイルを閉じます。

    注意

    通常、生成されたファイルを編集できません。次回ファイルが生成されたときに編集内容は失われます。

適切なコマンド セット クラスを拡張します。

コマンド セット クラスの部分宣言を含む新しいファイルを作成します。

コマンド セット クラスを拡張するには

  1. ソリューション エクスプローラーで、DslPackage プロジェクト内の GeneratedCode フォルダーを開き、CommandSet.tt の下で、生成されたファイル CommandSet.cs を開きます。 名前空間と、名前空間で定義されている最初のクラスの名前を書きとめます。 たとえば、次のように表示されることがあります。

    namespace Company.Language1

    { ... internal partial class Language1CommandSet : ...

  2. [DslPackage] で、Custom Code という名前のフォルダーを作成します。 このフォルダー内で、CommandSet.cs という名前の新しいクラス ファイルを作成します。

  3. 新しいファイル内に、生成された部分クラスと同じ名前空間および名前を持つ部分宣言を記述します。 次に例を示します。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.Design;
    namespace Company.Language1 /* Make sure this is correct */
    { internal partial class Language1CommandSet { ...
    

    メモ   クラス ファイル テンプレートを使用して新しいファイルを作成し場合、名前空間とクラス名の両方を修正する必要があります。

コマンド メソッドのオーバーライド

ほとんどのコマンドには 2 つの関連するメソッドが含まれます。ProcessOnStatus... のような名前のメソッドは コマンドが表示され、有効であるかどうかを決めます。 このメソッドはユーザーが図を右クリックするたびに呼び出され、すばやく実行し、何の変更も生じません。 ProcessOnMenu... はユーザーがコマンドをクリックしたときに呼び出され、コマンドの関数を実行します。 これらのメソッドの一方または両方をオーバーライドする場合があります。

メニュー上にコマンドが表示されるタイミングを変更するには

ProcessOnStatus... メソッドをオーバーライドします。 このメソッドは、パラメーター MenuCommand の Visible プロパティおよび Enabled プロパティを設定します。 通常、コマンドは this.CurrentSelection を見て、コマンドが選択された要素に適用されるかどうかを判断し、それらのプロパティを見て、コマンドが現在の状態で適用可能かどうかを判断します。

一般的なガイドとして、Visible プロパティは選択される要素により判断する必要があります。 Enabled プロパティは、コマンドがメニュー上に黒で表示されるかグレーで表示されるかを決め、現在の選択状態に依存します。

以下の例では、ユーザーが複数の図形を選択している場合、[削除] メニュー項目が無効になります。

注意

このメソッドはコマンドがキーストロークにより使用可能かどうかに影響しません。たとえば、[削除] メニュー項目を無効化しても、コマンドが Delete キーから呼び出されるのを妨げません。

/// <summary>
/// Called when user right-clicks on the diagram or clicks the Edit menu.
/// </summary>
/// <param name="command">Set Visible and Enabled properties.</param>
protected override void ProcessOnStatusDeleteCommand (MenuCommand command)
{
  // Default settings from the base method.
  base.ProcessOnStatusDeleteCommand(command);
  if (this.CurrentSelection.Count > 1)
  {
    // If user has selected more than one item, Delete is greyed out.
    command.Enabled = false;
  }
}

最初に基本的なメソッドを呼び出し、関係のないケースおよび設定のすべてに対処することを推奨します。

ProcessOnStatus メソッドは、ストア内の要素の作成、削除、または更新を実行しません。

コマンドの動作を変更するには

ProcessOnMenu... メソッドをオーバーライドします。 以下の例では、Delete キーを使用しても、ユーザーは一度に複数の要素を削除できません。

/// <summary>
/// Called when user presses Delete key 
/// or clicks the Delete command on a menu.
/// </summary>
protected override void ProcessOnMenuDeleteCommand()
{
  // Allow users to delete only one thing at a time.
  if (this.CurrentSelection.Count <= 1)
  {
    base.ProcessOnMenuDeleteCommand();
  }
}

要素またはリンクの作成、削除、または更新など、コードがストアに対して変更を加える場合、トランザクション内でそれを実行する必要があります。 詳細については、「方法: ドメイン固有言語における標準のメニュー コマンドを修正する」を参照してください。

メソッドのコードの記述

次のコード片はこれらのメソッド内で頻繁に役立ちます。

  • this.CurrentSelection. ユーザーが右クリックした図形は常にこの図形およびコネクタの一覧に含まれます。 ユーザーが図の空白部分をクリックした場合、このリストのメンバーは図のみになります。

  • this.IsDiagramSelected() - ユーザーが図の空白部分をクリックした場合、true。

  • this.IsCurrentDiagramEmpty()

  • this.IsSingleSelection() - ユーザーは複数の図形を選択しませんでした

  • this.SingleSelection - ユーザーが右クリックした図形または図

  • shape.ModelElement as MyLanguageElement - 図形により表されるモデル要素。

要素間の移動方法とオブジェクトおよびリンクの作成方法の詳細については、「プログラム コードにおけるモデル内の移動およびモデルの更新」を参照してください。

参照

処理手順

方法: ショートカット メニューにコマンドを追加する

[リダイレクト] チュートリアル: 選択されたリンクからの情報の取得

関連項目

MenuCommand

概念

IDE に VSPackage 追加のユーザー インターフェイス要素に示します。

VSCT XML スキーマ参照

その他の技術情報

ドメイン固有言語をカスタマイズするコードの記述

Visual Studio のコマンド (テーブル。Vsct) ファイル

VMSDK – 回路図のサンプル。拡張的な DSL のカスタマイズ

サンプル コード: 回路図