6

Ho sviluppato una finestra di dialogo simile a IntelliSense, che dovrebbe apparire su un determinato tratto chiave. (Il mio progetto è un VS-Package, la mia finestra di dialogo verrà aperta come comando) Il problema è che non so come visualizzare la mia finestra di dialogo sulla posizione attuale del cursore . Esistono modi semplici per trattare il testo attualmente selezionato, ad es. conCome ottenere la posizione assoluta del cursore di testo nell'estensione di Visual Studio 2010

TextSelection objSel = (EnvDTE.TextSelection)(dte.ActiveDocument.Selection); 

ma non riesco a ottenere alcuna posizione assoluta qui.

Ho cercato molto, ma non ho trovato nulla, che potrebbe aiutarmi. Forse qualcuno può darmi un suggerimento o, ancora meglio, esempi di codice per risolvere il mio problema. Apprezzerei molto il tuo aiuto!

risposta

6

Sto facendo esattamente la stessa cosa in un progetto in corso, quindi ecco il codice rilevante copiato e incollato. Genero l'oggetto activeWpfTextView altrove usando la seguente risposta: Find an IVsTextView or IWpfTextView for a given ProjectItem, in VS 2010 RC extension.

private IVsWindowFrame GetWindow() 
    { 
     // parent is the Microsoft.VisualStudio.Shell.ToolWindowPane 
     // containing this UserControl given in the constructor. 
     var window = (ToolWindowPane)parent.GetIVsWindowPane(); 
     return (IVsWindowFrame)window.Frame; 
    } 

    private void DoShow() 
    { 
     var window = GetWindow(); 

     var textViewOrigin = (activeWpfTextView as UIElement).PointToScreen(new Point(0, 0)); 

     var caretPos = activeWpfTextView.Caret.Position.BufferPosition; 
     var charBounds = activeWpfTextView 
      .GetTextViewLineContainingBufferPosition(caretPos) 
      .GetCharacterBounds(caretPos); 
     double textBottom = charBounds.Bottom; 
     double textX = charBounds.Right; 

     Guid guid = default(Guid); 
     double newLeft = textViewOrigin.X + textX - activeWpfTextView.ViewportLeft; 
     double newTop = textViewOrigin.Y + textBottom - activeWpfTextView.ViewportTop; 
     window.SetFramePos(VSSETFRAMEPOS.SFP_fMove, ref guid, 
      (int)newLeft, (int)newTop, 
      0, 0); 

     window.Show(); 
     resultsList.Focus(); 
    } 
+0

cosa è 'parent' in questo codice? –

+1

Aggiunto un commento nel codice che chiarisce da dove proviene 'parent'. – perelman