7

我正在編寫自己的Visual Studio 2010 Extension,它應該可以幫助我導航一個相當大的解決方案。
我已經有一個基於對話框的VS擴展,它顯示了一個類名和一個函數名,這取決於一些搜索條件。我現在可以點擊這個類/方法,然後我可以打開正確的文件並跳轉到該函數。
我現在想要做的是將光標置於該函數的開始位置。
我的代碼跳轉到該函數是:使用Visual Studio Extension設置光標位置

Solution currentSolution = ((EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0")).Solution; 
ProjectItem requestedItem = GetRequestedProjectItemToOpen(currentSolution.Projects, "fileToBeOpened"); 
if (requestedItem != null) 
{ 
    // open the document 
    Window window = requestedItem.Open(Constants.vsViewKindCode); 
    window.Activate(); 

    // search for the function to be opened 
    foreach (CodeElement codeElement in requestedItem.FileCodeModel.CodeElements) 
    { 
     // get the namespace elements 
     if (codeElement.Kind == vsCMElement.vsCMElementNamespace) 
     { 
      foreach (CodeElement namespaceElement in codeElement.Children) 
      { 
       // get the class elements 
       if (namespaceElement.Kind == vsCMElement.vsCMElementClass) 
       { 
        foreach (CodeElement classElement in namespaceElement.Children) 
        { 
         try 
         { 
          // get the function elements 
          if (classElement.Kind == vsCMElement.vsCMElementFunction) 
          { 
           if (classElement.Name.Equals("functionToBeOpened", StringComparison.Ordinal)) 
           { 
            classElement.StartPoint.TryToShow(vsPaneShowHow.vsPaneShowTop, null); 
            this.Close(); 
           } 
          } 
         } 
         catch 
         { 
         } 
        } 
       } 
      } 
     } 
    } 
} 

這裏最重要的點是window.Activate();打開正確的文件,並classElement.StartPoint.TryToShow(vsPaneShowHow.vsPaneShowTop, null);跳轉到正確的函數。
不幸的是,遊標未設置爲請求功能的開始。我怎樣才能做到這一點?我正在考慮像classElement.StartPoint.SetCursor()
乾杯西蒙

+0

Cyclomatically複雜嗎?此外,當你找到你要找的東西時,看起來你並沒有擺脫這種方法,這可能會有一些副作用(WAG)。 – Will

+0

@會:是的,我知道。這只是一些原型代碼。只是爲了演示我如何打開請求的類和函數... –

回答

12

我終於得到它...
你只需要使用TextSelection界面,你有方法MoveToPoint
所以從上面的代碼現在:

// open the file in a VS code window and activate the pane 
Window window = requestedItem.Open(Constants.vsViewKindCode); 
window.Activate(); 

// get the function element and show it 
CodeElement function = CodeElementSearcher.GetFunction(requestedItem, myFunctionName); 

// get the text of the document 
TextSelection textSelection = window.Document.Selection as TextSelection; 

// now set the cursor to the beginning of the function 
textSelection.MoveToPoint(function.StartPoint);