7

Ich schreibe meine eigene Visual Studio 2010 Extension, die mir helfen soll, eine ziemlich große Lösung zu navigieren.
Ich habe bereits eine dialogbasierte VS Extension, die mir je nach Suchkriterien einen Klassennamen und einen Funktionsnamen anzeigt. Ich kann nun auf diese Klasse/Methode klicken und ich kann dann schon die richtige Datei öffnen und zur Funktion springen.
Was ich jetzt tun möchte, ist den Cursor am Anfang dieser Funktion zu setzen.
Mein Code auf die Funktion zu springen:Setzen der Cursorposition mit 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 
         { 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Die wichtigen Punkte hier window.Activate(); sind die richtige Datei zu öffnen und classElement.StartPoint.TryToShow(vsPaneShowHow.vsPaneShowTop, null); auf die richtige Funktion zu springen.
Leider ist der Cursor nicht auf den Anfang der angeforderten Funktion gesetzt. Wie kann ich das machen? Ich denke an etwas wie classElement.StartPoint.SetCursor().
Prost Simon

+0

Cyclomatically Komplex? Außerdem sieht es so aus, als würden Sie nicht aus der Methode aussteigen, wenn Sie das finden, was Sie suchen, was einige Nebenwirkungen (WAG) haben könnte. – Will

+0

@Will: Ja, ich weiß. Dies ist nur eine Art Prototyp-Code. Nur um zu zeigen, wie ich die angeforderte Klasse und Funktion öffne ... –

Antwort

12

ich es endlich ...
Sie müssen nur die TextSelection-Schnittstelle verwenden, in dem Sie die Methode MoveToPoint haben.
So ist der Code von oben ist jetzt:

// 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);