2011-12-23 80 views
6

我開發了一個類似智能感知的對話框,它應該出現在特定的按鍵筆畫上。 (我的項目是一個VS包,我的對話框將作爲命令打開) 問題是,我不知道如何顯示我的對話框當前光標位置。處理當前選擇的文本有很簡單的方法,例如與如何在Visual Studio 2010擴展中獲取文本光標的絕對位置

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

但我不能在這裏獲得任何絕對位置。

我搜查了很多,但沒有找到任何東西,這可以幫助我。 也許有人可以給我一個提示或 - 甚至更好 - 代碼示例來解決我的問題。我真的很感謝你的幫助!

回答

6

我在做一個當前項目中完全一樣的東西,所以這裏是相關的代碼複製和粘貼。我使用以下答案在其他地方生成了activeWpfTextView對象: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

此代碼中的「父」是什麼? – 2015-09-30 14:52:08

+1

在代碼中增加了一條註釋,說明「父」來自哪裏。 – perelman 2016-01-31 09:54:22