2016-12-22 4 views
1

Visual Studio 2015 용 약간의 확장 프로그램을 작성 중입니다. VSPackage를 추가하여 솔루션 탐색기의 프로젝트 또는 폴더를 마우스 오른쪽 단추로 클릭 할 때 나타나는 바로 가기 메뉴에 일부 CustomCommands를 포함 시켰습니다.Visual Studio VSPackage 사용자 지정 명령

지금 내가하고 싶은 것은 "새 항목 추가 대화 상자를 열고이 VSPackage와 함께 설치 한 템플릿 중 하나를 선택하십시오"입니다.

private TemplateCommand(Package package) 
{ 
    if (package == null) 
     throw new ArgumentNullException(nameof(package)); 

    _package = package; 

    var commandService = ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService; 
    if (commandService == null) 
     return; 

    AddCommand(commandService, CommandId, CreateCustomTemplate); 
} 

CreateCustomTemplate 콜백 코드는 다음과 같습니다 : (I 단순히 작동 단지 확인하기 위해, messageBox가를 만드는 순간)

private void CreateCustomTemplate(object sender, EventArgs eventArgs) 
{ 
    //TODO: code to replace! 
    var message = string.Format(CultureInfo.CurrentCulture, "Inside {0}.CreateCustomTemplate()", GetType().FullName); 

    // Show a message box to prove we were here 
    VsShellUtilities.ShowMessageBox(
     ServiceProvider, 
     message, 
     "CREATE CustomTemplate", 
     OLEMSGICON.OLEMSGICON_INFO, 
     OLEMSGBUTTON.OLEMSGBUTTON_OK, 
     OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST); 
} 

이 내 명령을 초기화하는 데 사용하는 코드입니다

다시 요약하면 새 항목 추가 대화 상자를 열고 특정 항목 템플릿을 어떻게 선택합니까? 당신이 솔루션 탐색기 RightClick on Folder, then Add -> UserControl

당신이 비슷한 얻을 수있는 폴더에 클래스 또는 UserControl을 마우스 오른쪽 버튼으로 클릭을 만들려고 할 때 예를 들어

는 : Result

을 그리고 이것은이다 , 정확하게, 나는 달성하려고 노력하고있다. 분명히 내 자신의 템플릿과 UserControl을 만들고 싶습니다.

설명이 필요하면 언제든지 물어보십시오. 제안 사항에 대해 미리 감사드립니다.

답변

0

결국 내 문제가 해결되었습니다.

아쉽게도 File.AddNewItem (또는 Project.AddNewItem) 명령은 AddNewFile 대화 상자를보고 싶을 때 적합하지 않습니다.이 명령은 지정된 프로젝트에 항목을 추가하기 만합니다.

나는 대답을 Vladimir.Ilic의 응답 덕분에 정확히 here 웹 파기를 발견했습니다.

이것은 내가 내 목표 달성하기 위해 사용하는 코드입니다 :에 의해 전달 된 것과

internal sealed class TemplateCommand 
{ 
    private const int CustomCommandId = 0x1023; 

    private static readonly Guid CommandSet = COMMANDSET_GUID; 
    private readonly Package _package; 


    // ReSharper disable MemberCanBePrivate.Global 
    // ReSharper disable UnusedAutoPropertyAccessor.Global 
    public IServiceProvider ServiceProvider => _package; 

    public static TemplateCommand Instance { get; set; } 
    // ReSharper restore UnusedAutoPropertyAccessor.Global 
    // ReSharper restore MemberCanBePrivate.Global 

    public static void Initialize(Package package) 
    { 
     Instance = new TemplateCommand(package); 
    } 

    private TemplateCommand(Package package) 
    { 
     if (package == null) 
      throw new ArgumentNullException(nameof(package)); 

     _package = package; 

     var commandService = ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService; 
     if (commandService == null) 
      return; 

     AddCommand(commandService, CustomCommandId, CreateCustomCommand); 
    } 

    private static void AddCommand(IMenuCommandService commandService, int commandId, EventHandler callback) 
    { 
     var command = new CommandID(CommandSet, commandId); 
     var menuItem = new MenuCommand(callback, command); 
     commandService.AddCommand(menuItem); 
    } 

    private void CreateCustomCommand(object sender, EventArgs eventArgs) 
    { 
     AddNewItem("MyCustomCommand"); 
    } 

    private void AddNewItem(string itemName) 
    { 
     var dte = ServiceProvider.GetService(typeof(DTE)) as DTE; 
     if (dte == null) 
      return; 

     int iDontShowAgain; 
     uint projectItemId; 
     var strFilter = string.Empty; 

     var hierarchy = GetCurrentVsHierarchySelection(out projectItemId); 
     if (hierarchy == null) 
      return; 

     var project = ToDteProject(hierarchy); 
     if (project == null) 
      return; 

     var vsProject = ToVsProject(project); 
     if (vsProject == null) 
      return; 

     var addItemDialog = ServiceProvider.GetService(typeof(IVsAddProjectItemDlg)) as IVsAddProjectItemDlg; 
     if (addItemDialog == null) 
      return; 

     const uint uiFlags = (uint)(__VSADDITEMFLAGS.VSADDITEM_AddNewItems | __VSADDITEMFLAGS.VSADDITEM_SuggestTemplateName | __VSADDITEMFLAGS.VSADDITEM_AllowHiddenTreeView); 
     const string categoryNameInNewFileDialog = "MyCustomTemplates"; 

     // ProjectGuid for C# projects 
     var projGuid = new Guid("FAE04EC0-301F-11D3-BF4B-00C04F79EFBC"); 

     string projectDirectoryPath; 
     hierarchy.GetCanonicalName(projectItemId, out projectDirectoryPath); 
     var itemNameInNewFileDialog = itemName; 
     addItemDialog.AddProjectItemDlg(projectItemId, 
             ref projGuid, 
             vsProject, 
             uiFlags, 
             categoryNameInNewFileDialog, 
             itemNameInNewFileDialog, 
             ref projectDirectoryPath, 
             ref strFilter, 
             out iDontShowAgain); 
    } 

    private static IVsHierarchy GetCurrentVsHierarchySelection(out uint projectItemId) 
    { 
     IntPtr hierarchyPtr, selectionContainerPtr; 
     IVsMultiItemSelect mis; 
     var monitorSelection = (IVsMonitorSelection)Package.GetGlobalService(typeof(SVsShellMonitorSelection)); 
     monitorSelection.GetCurrentSelection(out hierarchyPtr, out projectItemId, out mis, out selectionContainerPtr); 

     var hierarchy = Marshal.GetTypedObjectForIUnknown(hierarchyPtr, typeof(IVsHierarchy)) as IVsHierarchy; 
     return hierarchy; 
    } 

    private static Project ToDteProject(IVsHierarchy hierarchy) 
    { 
     if (hierarchy == null) 
      throw new ArgumentNullException(nameof(hierarchy)); 

     object prjObject; 
     if (hierarchy.GetProperty(0xfffffffe, (int)__VSHPROPID.VSHPROPID_ExtObject, out prjObject) == VSConstants.S_OK) 
      return (Project)prjObject; 

     throw new ArgumentException("Hierarchy is not a project."); 
    } 

    private IVsProject ToVsProject(Project project) 
    { 
     if (project == null) 
      throw new ArgumentNullException(nameof(project)); 

     var vsSln = ServiceProvider.GetService(typeof(IVsSolution)) as IVsSolution; 
     if (vsSln == null) 
      throw new ArgumentException("Project is not a VS project."); 

     IVsHierarchy vsHierarchy; 
     vsSln.GetProjectOfUniqueName(project.UniqueName, out vsHierarchy); 
     // ReSharper disable SuspiciousTypeConversion.Global 
     var vsProject = vsHierarchy as IVsProject; 
     // ReSharper restore SuspiciousTypeConversion.Global 
     if (vsProject != null) 
      return vsProject; 

     throw new ArgumentException("Project is not a VS project."); 
    } 
} 

큰 감사를하고 도움을 시도 (또는 thinked)했다! 난 단순히 내 원하는 프로젝트에 파일을 추가 할 생각으로이 사람하는 데 도움이

희망,

는 감사

0

"Project.AddNewItem"또는 "File.AddNewItem"명령을 실행하여 대화 상자를 표시 할 수 있습니다. 프로그래밍 방식으로 명령을 실행하는 데는 여러 가지 방법이 있지만 가장 쉬운 방법은 EnvDTE.DTE 인스턴스를 가져 와서 dte.ExecuteCommand (commandName)를 호출하는 것입니다.

원하는 템플릿을 선택하는 방법은 parameters for the command File.AddNewItem을 참조하십시오. 운이 좋으면 Project.AddNewItem 명령과 동일합니다.

+0

은 내가 AddNewItem 시도를했다하지 않았다. 내가 그것을 줄 수있는 한 빨리 내가 ​​당신을 보내 줄게 그리고 어떻게 그것을 밖으로 일한거야 – Easly