如何计算在文本框视图区域中使一个索引垂直居中的垂直偏移量?

3

我正在开发一个文本编辑器,想要添加查找和替换功能。为了让选定的匹配项在屏幕上垂直居中,我希望能够滚动文本框。

1个回答

7
你可以使用GetRectFromCharacterIndex将字符索引转换为屏幕上的矩形。这将考虑滚动,因此您需要添加当前的VerticalOffset:
var start = textBox.GetRectFromCharacterIndex(textBox.SelectionStart);
var end = textBox.GetRectFromCharacterIndex(textBox.SelectionStart + textBox.SelectionLength);
textBox.ScrollToVerticalOffset((start.Top + end.Bottom - textBox.ViewportHeight) / 2 + textBox.VerticalOffset);

如果您有一个RichTextBox,您可以使用TextPointer.GetCharacterRect
var start = textBox.Selection.Start.GetCharacterRect(LogicalDirection.Forward);
var end = textBox.Selection.End.GetCharacterRect(LogicalDirection.Forward);
textBox.ScrollToVerticalOffset((start.Top + end.Bottom - textBox.ViewportHeight) / 2 + textBox.VerticalOffset);

有没有关于如何使用MVVM实现这个功能的最佳建议? - Justin
1
@Justin:矩形和偏移属于View,因此问题在于如何触发滚动以及如何标识文本范围。你可以让ViewModel引发一个带有要突出显示的范围的事件,并在View中编写处理程序将该范围滚动到中心。或者,您可以为View中的选择范围创建附加属性,当它们改变时滚动目标,然后将其绑定到ViewModel中范围的属性。这部分取决于您如何在ViewModel中建模查找和替换。 - Quartermeister

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