如何在Visual Studio 2010扩展中获取文本光标的绝对位置

7

我开发了一个类似IntelliSense的对话框,应该在按下特定键时出现。(我的项目是一个VS-Package,我的对话框将作为命令打开)问题是,我不知道如何在当前光标位置显示我的对话框。有一些简单的方法来处理当前选择的文本,例如使用

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

但是我在这里无法获取任何绝对位置。

我已经搜索了很多,但没有找到可以帮助我的东西。 也许有人可以给我一些提示或者更好的是,提供代码示例来解决我的问题。我真的非常感激你的帮助!

1个回答

7

我正在一个当前项目中做完全相同的事情,所以这里是相关的代码复制和粘贴。我在其他地方使用以下答案生成activeWpfTextView对象:查找给定ProjectItem的IVsTextView或IWpfTextView,在VS 2010 RC扩展中

    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();
    }

1
在代码中添加了一条注释,澄清了parent的来源。 - perelman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接