2011-12-23 67 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

相关问题