2017-07-16 78 views
0

簡而言之: 我是新來的VisualStudio可擴展性和我的目標是創建一個工具窗口顯示每個不同意見的擴展(已工作) VisualStudio解決方案的上下文,i。即解決方案視圖,項目視圖等。通過單擊解決方案資源管理器,類視圖,對象瀏覽器和(理想情況下)顯示內容的任何其他窗口的上下文菜單中的上下文菜單項來打開窗口項目,命名空間,類等。如何處理解決方案,項目及其內容在VisualStudio的擴展

搜索後,我發現了很多信息,但對於某些點我找不到非常有用的信息。我如何...

  • ...爲VisualStudio視圖創建上下文菜單項?
  • ...獲取當前開放的解決方案作爲代碼中的實例?
  • ...獲取解決方案的項目和他們作爲代碼中的實例?
  • ...在代碼中向/從解決方案/項目/類/ ...添加/刪除項目?
  • ...對解決方案資源管理器中的選擇更改做出反應?

我做了什麼,至今: 我讀Starting to Develop Visual Studio Extensions的文檔和下載的VSSDK-Extensibility-Samples。特別是WPF_Toolwindow的例子對我的目的很有意思,所以我建立並運行了它,目前爲止已經成功。另一個有趣的例子是WPFDesigner_XML,但它總是拋出一個NullReferenceException,所以我決定堅持使用之前的ToolWindow,現在它完全沒問題。另外,我試着通過仔細觀察項目中的每個文件,在調試器中運行它並分析發生的事情來了解該示例。我確信自己明白這一點,但也可以糾正我後面可能出現的錯誤想法。

現在,我已經創建了一個基於WPF_Toolwindow示例的新項目,重新命名並適應了我的需要(基本上,我創建了新的GUID,重命名了名稱空間並刪除了我不會使用的東西)。該擴展仍然在調試器中工作。我甚至從實驗實例中卸載了所有內容,並從頭開始調試擴展。

我儘量做到:

  • 有工具窗口加載特定視圖/視圖模型,在Solution Explorer中選擇更改(或任何其他的VisualStudio視圖)。另外,解決方案資源管理器樹(或任何其他VisualStudio視圖)中的每個節點的上下文菜單都應該有一個上下文菜單項。
  • 獲取當前開放的解決方案,包含的項目和基本上所有內容,從解決方案資源管理器的內容作爲實例在我的viewmodel中可處理。我需要正確地從
    1. 一個文件夾中的項目添加/刪除
      • 類/結構/枚舉到/
      • 命名空間
  • 屬性/字段/從一個類/結構
  • 根據解決方案的信息生成代碼並將該文件正確添加到項目中。
  • 有沒有人知道這樣的事情的例子或任何人都可以給我一些提示,我可以找到更多的信息?任何幫助,將不勝感激。提前致謝。

    +0

    第一個問題,你的意思是在項目項添加上下文菜單動態。第二個問題,請嘗試使用Roslyn從解決方案中獲取相關的類。 –

    +0

    第三個問題,你的意思是生成一個代碼文件並將該文件添加到項目中? –

    +0

    (1)這些項目已經有一個上下文菜單,我想添加一個新的命令到這個菜單。 (2)感謝Roslyn的提示,我會看看。 (3)是的,基本上將一個文件添加到項目中,而無需手動操作項目文件會很好。 –

    回答

    0

    (1)項目已經有一個上下文菜單,我想添加一個新的命令到這個菜單。

    ,如果你想一個子菜單添加到上下文菜單,下面的鏈接提供完整的樣品 enter image description here

    https://github.com/visualstudioextensibility/VSX-Samples/tree/master/CommandSubmenu

    (3)是的,基本上添加文件到沒有手動操作項目文件的項目會很好。

    您可以通過Project.ProjectItems.AddFromFile將文件添加到項目中,下面提供了一個供您參考的示例。

    https://www.mztools.com/Articles/2014/MZ2014009.aspx

    更新:

    我選擇一個項目,類似的事件。有這樣的事件我可以訂閱嗎?

    您可以使用IVsMonitorSelection來實現。這裏是檢索相關項目路徑供您參考的代碼。

    IntPtr hierarchyPointer, selectionContainerPointer; 
          Object selectedObject = null; 
          IVsMultiItemSelect multiItemSelect; 
          uint projectItemId; 
    
          IVsMonitorSelection monitorSelection = 
            (IVsMonitorSelection)Package.GetGlobalService(
            typeof(SVsShellMonitorSelection)); 
    
          monitorSelection.GetCurrentSelection(out hierarchyPointer, 
                   out projectItemId, 
                   out multiItemSelect, 
                   out selectionContainerPointer); 
    
          IVsHierarchy selectedHierarchy = Marshal.GetTypedObjectForIUnknown(
                   hierarchyPointer, 
                   typeof(IVsHierarchy)) as IVsHierarchy; 
    
          if (selectedHierarchy != null) 
          { 
           ErrorHandler.ThrowOnFailure(selectedHierarchy.GetProperty(
                    projectItemId, 
                    (int)__VSHPROPID.VSHPROPID_ExtObject, 
                    out selectedObject)); 
          } 
    
          Project selectedProject = selectedObject as Project; 
    
          string projectPath = selectedProject.FullName; 
    

    有關使用的更多信息,請參見:

    https://www.mztools.com/articles/2007/mz2007024.aspx

    +0

    您在原始問題中的評論讓我讀到更多關於Roslyn的信息,這似乎正是我想要的。 VSX-Samples包含了我的上下文菜單需求 - 感謝這個提示,它必須將它們與VSSDK-Samples混淆起來。 MZ-Tools看起來很有趣,但我不想在學習期間購買東西,而Roslyn似乎已經足夠適應我的需求。如果您可以在解決方案資源管理器中添加一些關於如何應對選擇更改的信息,我會接受您的答案。感謝您的有用答案:) –

    +0

    >如果您可以在解決方案資源管理器中添加一些關於如何對選擇更改作出反應的信息,那麼您的意思是解決方案資源管理器中的上下文菜單,如果是這樣,我提供的鏈接是開源的,您可以免費下載。如果不是,請詳細描述一下。 –

    +0

    不,上下文菜單是問題的另一部分。我的意思是:我點擊解決方案資源管理器中的當前解決方案,然後解決方案被選中,像SolutionNodeSelected這樣的事件被激發。或者,我選擇一個項目並且類似的事件被解僱。有這樣的事件我可以訂閱嗎? Toolwindow示例使用選擇跟蹤器來更新屬性窗口的內容。也許我需要使用類似的東西,但我還是無法弄清楚。 –

    相關問題