2011-12-23 13 views
6

He desarrollado un Diálogo tipo IntelliSense, que debería aparecer en un golpe de tecla específico. (Mi proyecto es un paquete VS, mi cuadro de diálogo se abrirá como un comando) El problema es que no sé cómo mostrar mi cuadro de diálogo en el posición actual del cursor. Hay formas fáciles de tratar con el texto seleccionado actualmente, p. conCómo obtener la posición absoluta del cursor de texto en la extensión de Visual Studio 2010

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

pero no puedo obtener ninguna posición absoluta aquí.

He buscado mucho, pero no encontré nada, lo que podría ayudarme. Tal vez alguien me puede dar una pista o, mejor aún, ejemplos de código para resolver mi problema. ¡Realmente apreciaría tu ayuda!

Respuesta

6

Estoy haciendo exactamente lo mismo en un proyecto actual, así que aquí está la copia del código relevante y pegada. Genero el objeto activeWpfTextView en otro lugar usando la siguiente respuesta: 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

¿Qué es 'parent' en este código? –

+1

Agregó un comentario en el código aclarando de dónde viene 'parent'. – perelman

Cuestiones relacionadas