Как получить абсолютную позицию текстового курсора в расширении Visual Studio 2010 - PullRequest
6 голосов
/ 23 декабря 2011

Я разработал диалоговое окно, похожее на IntelliSense, которое должно отображаться при нажатии клавиши. (Мой проект - VS-Package, мой диалог будет открыт как команда) Проблема в том, что я не знаю, как отобразить мой диалог в текущей позиции курсора . Существуют простые способы работы с выбранным в данный момент текстом, например, с

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

но я не могу получить здесь абсолютную позицию.

Я много искал, но не нашел ничего, что могло бы мне помочь. Может быть, кто-то может дать мне подсказку или - даже лучше - примеры кода, чтобы решить мою проблему. Буду очень признателен за вашу помощь!

1 Ответ

6 голосов
/ 08 февраля 2012

Я делаю то же самое в текущем проекте, поэтому вот соответствующая копия кода и вставлена.Я создаю объект activeWpfTextView в другом месте, используя следующий ответ: Найдите IVsTextView или IWpfTextView для данного ProjectItem в расширении 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();
    }
...