Как наложить элемент управления на поверхность кода Visual Studio
-
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
);
}