Как наложить элемент управления на поверхность кода Visual Studio

StackOverflow https://stackoverflow.com/questions/1619219

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пишу надстройку в Sql Server Management Studio, используя API-интерфейсы Visual Studio Extensibilty. У меня был некоторый успех при наложении элемента управления на текстовую поверхность (я пытаюсь эмулировать список действий CodeRush / Refactor, похожий на комбо intellisense), однако я могу найти только его координатное пространство на основе следующего свойства:

get
{
    var point = TextDocument.Selection.TopPoint;
    return new Cursor( point.DisplayColumn, point.Line );
}

Этот код позволяет мне затем преобразовывать столбцы / строки в пиксели, однако я не могу найти способ сместить столбцы / строки, когда текстовый редактор прокручивается либо вертикально, либо горизонтально. Это приводит к тому, что список исчезает под видимым пространством экрана.

Я ищу метод получения экранных координат из текущей пары столбцов / строк, чтобы я мог поместить список рядом с курсором, независимо от позиции прокрутки.

Это было полезно?

Решение

Свойство TextDocument.Selection типа TextSelection имеет свойство TextPane - см. здесь для получения дополнительной информации. Это явно не говорит об этом, но TextPane - это часть экрана, которая видна. Кроме того, свойство StartPoint для TextPane обеспечивает смещение прокручиваемого текста.

Поэтому я смог определить положение смещенного курсора, вычтя TextPane.StartPoint из начальной точки выбора:

get
{
    var start = TextDocument.Selection.TextPane.StartPoint;
    var top = TextDocument.Selection.TopPoint;
    return new Cursor( 
        top.DisplayColumn - start.DisplayColumn + 1 , 
        top.Line - start.Line + 1 
    );
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top