방법: 바로 가기 메뉴에 명령 추가

사용자를 DSL에 관련 된 작업을 수행할 수 있도록 도메인 관련 언어 (DSL)에 메뉴 명령을 추가할 수 있습니다.사용자 다이어그램에서 마우스 오른쪽 단추로 누르면 명령 컨텍스트 (바로 가기) 메뉴에 표시 됩니다.특정 상황에서 해당 메뉴에만 표시 되도록 명령을 정의할 수 있습니다.특정 형식의 요소 또는 요소의 특정 상태에만 클릭할 때 예를 들어, 사용자 명령을 수 있습니다.

즉, 단계 DslPackage 프로젝트에는 다음과 같이 수행 됩니다.

  1. Commands.vsct의 명령을 선언합니다

  2. 업데이트 패키지 버전 번호를 Package.tt.Commands.vsct가 변경 될 때마다이 작업을 수행 해야

  3. CommandSet 클래스의 메서드를 작성 명령을 표시 하 고 원하는 작업을 수행 하는 명령을 정의 합니다.

샘플에 대 한 참조를 시각화 및 모델링 SDK 웹 사이트.

[!참고]

CommandSet.cs에서 재정의 하 여 일부 기존 명령 잘라내기, 붙여넣기, 모두 선택 및 인쇄 등의 동작을 수정할 수도 있습니다.자세한 내용은 방법: 도메인별 언어에서 표준 메뉴 명령 수정를 참조하십시오.

MEF는 명령을 정의 합니다.

관리 되는 확장 프레임 워크 (MEF) 다이어그램 메뉴에서 메뉴 명령을 정의 하는 대체 방법을 제공 합니다.기본 목적은 DSL 또는 다른 당사자가 확장 될 수 있도록 하는 것.사용자는 DSL을 설치 하도록 선택할 수 있습니다 또는 DSL과 확장을 설치할 수 있습니다.그러나 MEF MEF에서 DSL 사용 하는 초기 작업 후 바로 가기 메뉴 명령을 정의 하는 작업을 줄일 수 있습니다.

경우이 항목의 메서드를 사용 합니다.

  1. 메뉴 명령을 마우스 오른쪽 단추로 누르고 바로 가기 메뉴 이외의 메뉴를 정의 하 고 원하는.

  2. 특정 그룹의 명령 메뉴를 정의 하려고 합니다.

  3. 다른 DSL 자체 명령 확장을 사용 하지 않으려는.

  4. 명령을 정의 하려면 원합니다.

그렇지 않으면 MEF 메서드를 사용 하 여 명령을 정의 하는 것이 좋습니다.자세한 내용은 MEF를 사용하여 DSL 확장를 참조하십시오.

Commands.vsct의 명령을 선언합니다

메뉴 명령의 Dslpackage\commands.vsct에 선언 됩니다.이러한 정의 메뉴 항목 및 메뉴에 표시 되는 위치에 레이블을 지정 합니다.

파일 commands.vsct을 편집 하 여, 디렉토리에 있는 여러 개의.h 파일에서 정의 가져옵니다 Visual Studio SDK 설치 경로가\VisualStudioIntegration\Common\Inc.DSL 정의에서 생성 된 Generatedvsct.vsct을 포함 되어 있습니다.

.Vsct 파일에 대 한 자세한 내용은 Visual Studio 명령은 테이블 (.Vsct) 파일.

명령을 추가 하려면

  1. 솔루션 탐색기, 아래는 DslPackage 프로젝트에서 commands.vsct을 엽니다.

  2. 에 Commands 요소를 하나 이상의 단추 및 그룹을 정의 합니다.A 단추 메뉴 항목입니다.A 그룹 메뉴에서는 섹션입니다.이러한 항목을 정의 하려면 다음 요소를 추가 합니다.

    <!-- Define a group - a section in the menu -->
    <Groups>
      <Group guid="guidCustomMenuCmdSet" id="grpidMyMenuGroup" priority="0x0100">
        <!-- These symbols are defined in GeneratedVSCT.vsct -->
        <Parent guid="guidCmdSet" id="menuidContext" />
      </Group>
    </Groups>
    <!-- Define a button - a menu item - inside the Group -->
    <Buttons>
      <Button guid="guidCustomMenuCmdSet" id="cmdidMyContextMenuCommand"
        priority="0x0100" type="Button">
        <Parent guid="guidCustomMenuCmdSet" id="grpidMyMenuGroup"/>
        <!-- If you do not want to place the command in your own Group, 
             use Parent guid="guidCmdSet" id="grpidContextMain".
             These symbols are defined in GeneratedVSCT.vsct -->
        <CommandFlag>DynamicVisibility</CommandFlag>
        <Strings>
          <ButtonText>My Context Menu Command</ButtonText>
        </Strings>
      </Button>
    </Buttons>
    

    [!참고]

    각 단추 또는 그룹 GUID와 정수 ID에 의해 식별 됩니다.동일한 GUID 가진 여러 그룹 및 단추를 만들 수 있습니다.그러나 이들은 서로 다른 id가 있어야 합니다.실제 Guid 및 숫자 Id를 GUID 이름 및 ID 이름 변환 되는 <Symbols> 노드.

  3. 로드 되는 컨텍스트 도메인 관련 언어의 명령에 대해 표시 유형 제약 조건을 추가 합니다.자세한 내용은 VisibilityConstraints 요소를 참조하십시오.

    이 위해서는 다음 요소를 추가 CommandTable 요소 뒤의 Commands 요소입니다.

    <VisibilityConstraints>
      <!-- Ensures the command is only loaded for this DSL -->
      <VisibilityItem guid="guidCustomMenuCmdSet" id="cmdidMyContextMenuCommand"
        context="guidEditor"/>
    </VisibilityConstraints>
    
  4. Guid 및 id에 사용 되는 이름을 정의 합니다.이 작업을 수행 하려면 추가 Symbols 요소에는 CommandTable 요소 뒤의 Commands 요소입니다.

    <Symbols>
      <!-- Substitute a unique GUID for the placeholder: -->
      <GuidSymbol name="guidCustomMenuCmdSet"
        value="{00000000-0000-0000-0000-000000000000}" >
        <IDSymbol name="grpidMyMenuGroup" value="0x01001"/>
        <IDSymbol name="cmdidMyContextMenuCommand" value="0x00001"/>
      </GuidSymbol>
    </Symbols>
    
  5. 대체 {000...000} 그룹 및 메뉴 항목을 식별 하는 GUID를 사용 합니다.새 GUID를 가져올 수 있는 GUID 만들기 에서 도구는 도구 메뉴.

    [!참고]

    그룹 또는 메뉴 항목을 더 추가 하는 경우 동일한 GUID를 사용할 수 있습니다.그러나에 대 한 새 값을 사용 해야 해당 IDSymbols.

  6. 이 절차에서 복사한 코드에서 각 다음 문자열 문자열을 바꿀:

    • grpidMyMenuGroup

    • cmdidMyContextMenuCommand

    • guidCustomMenuCmdSet

    • 내 상황에 맞는 메뉴 명령

패키지 버전 Package.tt 업데이트

추가 하거나 명령 변경 될 때마다 업데이트를 version 의 매개 변수는 ProvideMenuResourceAttribute 도메인 관련 언어의 새 버전을 릴리스하기 전에 패키지 클래스에 적용 되.

패키지 클래스에 생성 된 파일에 정의 되어 있기 때문에 Package.cs 파일을 생성 하 여 텍스트 서식 파일에서 특성을 업데이트 합니다.

Package.tt 파일을 업데이트 하려면

  1. 솔루션 탐색기DslPackage 프로젝트에 GeneratedCode 폴더에서 Package.tt 파일을 엽니다.

  2. 찾아는 ProvideMenuResource 특성입니다.

  3. 증가 version 매개 변수가 두 번째 매개 변수 특성입니다.원하는 경우 매개 변수 이름에 그 목적을 명시적으로 다시 작성할 수 있습니다.예를 들면 다음과 같습니다.

    [VSShell::ProvideMenuResource("1000.ctmenu", version: 2 )]

명령 동작 정의

DSL Dslpackage\generatedcode\commandset.cs에서 선언 된 partial 클래스에서 구현 하는 몇 가지 명령에 이미 있습니다.새 명령을 추가 하려면 같은 클래스의 partial 선언이 포함 된 새 파일을 작성 하 여이 클래스를 확장 해야 합니다.일반적으로 클래스 이름입니다 <YourDslName>CommandSet.클래스의 이름을 확인 하 고 그 내용을 조사 하 여 시작 하는 것이 유용 합니다.

명령 집합 클래스에서 파생 된 CommandSet.

CommandSet 클래스를 확장.

  1. 솔루션 탐색기에서 DslPackage 프로젝트를 GeneratedCode 폴더를 엽니다 다음 Commandset.tt에서 확인 및 Commandset.cs에서 생성 된 파일을 엽니다.노트의 첫 번째 이름과 네임 스페이스는 클래스도 정의 합니다.예를 들어, 다음과 같이 나타날 수 있습니다.

    namespace Company.Language1

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

  2. DslPackage, 사용자 지정 코드 라는 폴더를 만듭니다.이 폴더에 이름이 지정 된 새 클래스 파일 만들기 CommandSet.cs.

  3. 새 파일에 같은 네임 스페이스와 이름으로 생성 된 partial 클래스는 partial 선언을 작성 합니다.예를 들면 다음과 같습니다.

    namespace Company.Language1 /* Make sure this is correct */

    { internal partial class Language1CommandSet { ...

    참고 클래스 템플릿이 새 파일을 만드는 데 사용 하는 경우 네임 스페이스와 클래스 이름을 수정 해야 합니다.

Dd820681.collapse_all(ko-kr,VS.110).gif설정 명령 클래스를 확장 합니다.

일반적으로 명령 집합 코드를 다음과 같은 네임 스페이스를 가져올 필요가 있습니다.

using System;
using System.Collections.Generic;
using System.ComponentModel.Design; 
using System.Linq;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
using Microsoft.VisualStudio.Modeling.Shell;

네임 스페이스와 클래스 이름을 생성 된 Commandset.cs에 일치 하도록 조정 합니다.

namespace Company.Language1 /* Make sure this is correct */
{
  // Same class as the generated class.
  internal partial class Language1CommandSet 
  {

하나 때 명령을 상황에 맞는 메뉴와 명령을 수행 하려면 다른 표시 됩니다 확인 하려면 두 개의 메서드를 정의할 수 있습니다.이러한 메서드는 재정의 되지 않습니다. 대신 명령 목록에 등록 됩니다.

Dd820681.collapse_all(ko-kr,VS.110).gif정의할 때 명령을 볼 수 있습니다

각 명령에 대 한 정의 OnStatus... 결정 여부 명령 메뉴에 나타납니다 및 여부 그는 회색으로 표시 하는 방법입니다.설정의 Visible 및 Enabled 속성에는 MenuCommand, 다음 예제에서와 같이.이 메서드는 바로 가기 메뉴를 신속 하 게 작업 해야 하므로 사용자가 다이어그램을 마우스 오른쪽 단추로 클릭할 때마다 생성 하기 위해 호출 됩니다.

이 예에서는 사용자 선택한 요소 중 하나는 특정 상태에 있을 때만 사용할 수 있습니다 특정 형식의 셰이프를 선택한 경우에 명령이 표시 됩니다.예제 클래스 다이어그램 DSL 서식 파일을 기반으로 하 고 ClassShape 및 ModelClass DSL에 정의 된 형식입니다.

private void OnStatusMyContextMenuCommand(object sender, EventArgs e)
{
  MenuCommand command = sender as MenuCommand;
  command.Visible = command.Enabled = false;
  foreach (object selectedObject in this.CurrentSelection)
  {
    ClassShape shape = selectedObject as ClassShape;
    if (shape != null)
    {
      // Visibility depends on what is selected.
      command.Visible = true;
      ModelClass element = shape.ModelElement as ModelClass;
      // Enabled depends on state of selection.
      if (element != null && element.Comments.Count == 0)
      {
        command.Enabled = true;
        return; // seen enough
} } } }

다음 조각에서는 OnStatus 메서드가 자주 유용합니다.

  • this.CurrentSelection.사용자를 마우스 오른쪽 단추로 누른 셰이프 항상이 목록에 포함 됩니다.사용자가 다이어그램의 빈 부분을 클릭 하면 다이어그램 그룹의 유일한 구성원입니다.

  • this.IsDiagramSelected() - true사용자 다이어그램의 빈 부분을 클릭 하면 됩니다.

  • this.IsCurrentDiagramEmpty()

  • this.IsSingleSelection()-사용자가 여러 개체를 선택 하지 않은

  • this.SingleSelection-도형 또는 사용자를 마우스 오른쪽 단추로 클릭 하는 다이어그램

  • shape.ModelElement as MyLanguageElement-모델 요소는 도형으로 표시 됩니다.

일반 지침으로 하는 Visible 속성이 어떤 선택에 의존 하 고는 Enabled 속성 요소를 선택한 상태에 따라 달라 집니다.

OnStatus 메서드는 저장소의 상태를 변경할 수 없습니다.

Dd820681.collapse_all(ko-kr,VS.110).gif명령이 수행할 작업을 정의 합니다.

각 명령에 대 한 정의 OnMenu... 는 사용자가 메뉴 명령을 클릭할 때 필요한 동작을 수행 하는 방법입니다.

모델 요소를 변경 하는 경우 내부 트랜잭션을 수행 해야 합니다.자세한 내용은 방법: 도메인별 언어에서 표준 메뉴 명령 수정를 참조하십시오.

이 예제에서 ClassShape, ModelClass, 및 Comment 클래스 다이어그램 DSL 템플릿에서 파생 된 DSL에 정의 된 형식입니다.

private void OnMenuMyContextMenuCommand(object sender, EventArgs e)
{
  MenuCommand command = sender as MenuCommand;
  Store store = this.CurrentDocData.Store;
  // Changes to elements and shapes must be performed in a Transaction.
  using (Transaction transaction =
       store.TransactionManager.BeginTransaction("My command"))
  {
    foreach (object selectedObject in this.CurrentSelection)
    {
      // ClassShape is defined in my DSL.
      ClassShape shape = selectedObject as ClassShape;
      if (shape != null)
      {
        // ModelClass is defined in my DSL.
        ModelClass element = shape.ModelElement as ModelClass;
        if (element != null)
        {
          // Do required action here - for example:

          // Create a new element. Comment is defined in my DSL.
          Comment newComment = new Comment(element.Partition);
          // Every element must be the target of an embedding link.
          element.ModelRoot.Comments.Add(newComment);
          // Set properties of new element.
          newComment.Text = "This is a comment";
          // Create a reference link to existing object.
          element.Comments.Add(newComment);
        }
      }
    }
    transaction.Commit(); // Don't forget this!
  }
}

모델에서 개체 개체를 탐색 하는 방법에 대 한 개체 및 링크를 만드는 방법에 대 한 자세한 내용은 참조 하십시오. 방법: 도메인별 언어에서 표준 메뉴 명령 수정.

Dd820681.collapse_all(ko-kr,VS.110).gifRegister 명령

C#에 선언 CommandSet.vsct 기호 절에 대 한 GUID 및 ID 값을 반복 합니다.

    private Guid guidCustomMenuCmdSet = 
        new Guid("00000000-0000-0000-0000-000000000000");
    private const int grpidMyMenuGroup = 0x01001;
    private const int cmdidMyContextMenuCommand = 1;

에 삽입 된 동일한 GUID 값 사용 Commands.vsct.

[!참고]

기호 섹션의 VSCT 파일을 변경 하는 경우에 일치 하도록 이러한 선언을 변경 해야 합니다.또한이 package.tt의 버전 번호가 증가 되어야

메뉴 명령을 명령 집합의 일부로 등록 하십시오.GetMenuCommands()다이어그램 초기화 될 때 한 번 호출 됩니다.

protected override IList<MenuCommand> GetMenuCommands()
{
  // Get the list of generated commands.
  IList<MenuCommand> commands = base.GetMenuCommands();
  // Add a custom command:
  DynamicStatusMenuCommand myContextMenuCommand =
    new DynamicStatusMenuCommand(
      new EventHandler(OnStatusMyContextMenuCommand),
      new EventHandler(OnMenuMyContextMenuCommand),
      new CommandID(guidCustomMenuCmdSet, cmdidMyContextMenuCommand));
  commands.Add(myContextMenuCommand);
  // Add more commands here.
  return commands;
} 

테스트 명령

빌드 및 DSL 실험 Visual Studio 인스턴스를 실행 합니다.명령은 사용자가 지정한 경우에는 바로 가기 메뉴에서 나타나야 합니다.

명령을 실행 하려면

  1. 에 있는 솔루션 탐색기 도구 모음을 클릭 모든 템플릿 변환.

  2. 키를 눌러 F5 , 솔루션을 다시 빌드하고 실험적인 빌드는 도메인별 언어 디버깅을 시작 합니다.

  3. 실험적인 빌드에 샘플 다이어그램을 엽니다.

  4. 다양 한 항목에 명령입니다 제대로 활성화 또는 비활성화과 적절 하 게 표시 하거나, 선택한 항목에 따라 숨길 것을 확인 하는 다이어그램을 마우스 오른쪽 단추로 클릭 합니다.

문제 해결

명령 메뉴에 나타나지 않습니다.

  • DSL 패키지를 설치할 때까지 Visual Studio 인스턴스가 디버깅에 해당 명령이 표시 됩니다.자세한 내용은 도메인별 언어 솔루션 배포를 참조하십시오.

  • 시험용 샘플을이 DSL에 대 한 올바른 파일 확장명이 있는지 확인 하십시오.파일 이름 확장명을 확인 하려면 기본 인스턴스를 Visual Studio Dsldefinition.dsl를 엽니다.다음 DSL 탐색기에서 편집기 노드를 마우스 오른쪽 단추로 클릭 한 다음 속성을 클릭 합니다.속성 창에서 FileExtension 속성을 검사 합니다.

  • 하지 패키지 버전 번호 증가?

  • OnStatus 메서드는 시작 부분에 중단점을 설정 합니다.위로 다이어그램의 일부를 마우스 오른쪽 단추로 누르면 나누어야 합니다.

    OnStatus 메서드가 호출 되어:

    • Guid와 Id를 CommandSet 코드에서 기호 섹션의 commands.vsct에 일치 하는지 확인 합니다.

    • Commands.vsct의 GUID 및 각 부모 노드에 ID 올바른 부모 그룹을 식별 하는 있는지 확인 하십시오.

    • Visual Studio 명령 프롬프트에서 /rootsuffix exp /setup devenv를 입력 합니다.다음 디버깅 Visual Studio 인스턴스를 다시 시작 합니다.

  • 그 명령을 확인 하는 OnStatus 메서드를 통해 실행 합니다.화면 표시 및 명령입니다.활성화를 설정 하는 true입니다.

텍스트가 잘못 된 메뉴 또는 명령을 잘못 된 위치에 나타납니다:

  • GUID와 ID이이 명령에는 고유 해야 합니다.

  • 이전 버전의 패키지를 제거 해야 합니다.

참고 항목

개념

방법: 도메인별 언어에서 표준 메뉴 명령 수정

기타 리소스

도메인별 언어를 사용자 지정하는 코드 작성

코드 샘플: 회로 다이어그램