7

내 VS 확장 프로그램에서 새 프로젝트 유형에 대한 메뉴 항목을 추가해야합니다. 하지만 내 맞춤 유형에만 표시하고 싶습니다. 그래서 파일 .vcst이 코드 추가 :메뉴 항목의 동적 표시

<Button guid="_Interactive_WindowCmdSet" id="cmdidLoadUI" priority="0x0100" type="Button"> 
    <Parent guid="_Interactive_WindowCmdSet" id="ProjectItemMenuGroup" /> 
    <Icon guid="guidImages" id="bmpPic1" /> 
    <CommandFlag>DynamicVisibility</CommandFlag> 
    <Strings> 
     <ButtonText>Load</ButtonText> 
    </Strings> 
    </Button> 


    <Group guid="_Interactive_WindowCmdSet" id="ProjectItemMenuGroup" priority="0x0600"> 
    <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_PROJNODE"/> 
    </Group> 

를 초기화 패키지로이 코드를 추가 :

  // Create the command for the menu item. 
      CommandID projectMenuCommandID = new CommandID(GuidList.Interactive_WindowCmdSet, (int)PkgCmdIDList.cmdidLoadUI); 
      OleMenuCommand projectmenuItem = new OleMenuCommand(LoadUIMenuItemCallback, projectMenuCommandID); 
      projectmenuItem.BeforeQueryStatus += projectmenuItem_BeforeQueryStatus; 
      mcs.AddCommand(projectmenuItem); 

그리고 쿼리 상태 핸들러는 다음과 같습니다 문제는

private void projectmenuItem_BeforeQueryStatus(object sender, EventArgs e) 
    { 
     OleMenuCommand menuCommand = sender as OleMenuCommand; 

     if (menuCommand != null) 
      menuCommand.Visible = IsProjectOfRightType(GetSelected<Project>()); 
    } 

을 -이 상태 핸들러가 호출되지 않습니다. 따라서 모든 프로젝트 유형에 대해이 메뉴 항목이 표시되었습니다.

내가 좋아하는, 내 패키지에 IOleCommandTarget 인터페이스를 구현하는 것이 시도했다 :

public int QueryStatus(ref Guid guidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText) 
    { 
     // Disable all commands in case if project is VisuaART project, otherwise - disable them. 
     OLECMDF cmdf; 

     for (int i = 0; i < cCmds; i++) 
     { 
      var command = prgCmds[i]; 
      if (command.cmdID == PkgCmdIDList.cmdidLoadUI) 
      { 
       if (IsProjectOfRightType(GetSelected<Project>())) 
        command.cmdf = (uint)COMMAND_SUPPORTED; 
       else 
        command.cmdf = (uint)COMMAND_UNSUPPORTED; 
      } 

     } 
     return VSConstants.S_OK; 
    } 

    private const OLECMDF COMMAND_SUPPORTED = OLECMDF.OLECMDF_SUPPORTED | OLECMDF.OLECMDF_ENABLED; 
    private const OLECMDF COMMAND_UNSUPPORTED = OLECMDF.OLECMDF_INVISIBLE; 

하지만 그 중 하나가 도움이되지 않습니다. 메서드가 호출되었지만 OLECMDF.OLECMDF_INVISIBLE을 설정하면 아무 작업도 수행되지 않습니다. 지원되지 않는 메뉴 항목에 대해이 메뉴 항목을 숨기려면 어떻게해야합니까?

답변

7

아마도이 문제는 패키지의로드와 관련이 있습니다. 자동으로 패키지를로드하려면 당신의 패키지 클래스에이 속성을 추가

[ProvideAutoLoad("f1536ef8-92ec-443c-9ed7-fdadf150da82")] 

예 :

. 
. 
[ProvideAutoLoad("f1536ef8-92ec-443c-9ed7-fdadf150da82")] 
public sealed class MyPackageTest : Package 
{ 
. 
. 

당신이 하나를 클릭 할 때이 클래스는 단지로드됩니다이 속성을 추가하지 않는 경우 버튼을 클릭하십시오.

도움이 되었기를 바랍니다.

+1

UI 컨텍스트 GUID 가능성은 여기를 참조하십시오. https://msdn.microsoft.com/en-us/library/bb166496.aspx 위 페이지에서 GUID를 볼 수 있으며 UICONTEXT_SolutionExists를 의미합니다. – CSA