我正在使用Visual Studio Extensibilty API在Sql Server Management Studio中编写插件。我已经成功地将控件覆盖到文本表面上(我试图模拟CodeRush / Refactor动作列表,类似于intellisense组合),但是我只能根据以下属性找到它的坐标空间:

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

这段代码允许我将cols / rows转换为像素,但是当文本编辑器垂直或水平滚动时,我无法找到偏移cols / rows的方法。这会导致列表框消失在可见屏幕空间下方。

我正在寻找的是一种从当前col / row对获取屏幕坐标的方法,这样我就可以将列表框放在光标旁边,而不管滚动位置如何。

有帮助吗?

解决方案

TextDocument.Selection属性,类型为TextSelection,具有TextPane属性 - 请参阅这里了解更多信息。它没有明确说明,但TextPane是可见的屏幕部分。此外,TextPane的StartPoint属性提供滚动文本的“偏移量”。

因此,我可以通过从Selection的StartPoint中减去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