我将RichEditBox用于富文本编辑器:当用户在richEditBox控件中键入文本时,我为文本中的不同关键字使用了不同的颜色。

在进行更改之前,我保存当前选择位置:

ITextSelection selection = richEditBox.Document.Selection;
int originalStartPosition = selection.StartPosition;
int originalEndPosition = selection.EndPosition;


然后我更改文本某些部分的颜色,例如:

selection.SetRange(startIndex, stopIndex);
selection.CharacterFormat.ForegroundColor = Colors.Red;


进行所有更改后,我恢复了当前选择位置:

selection.SetRange(originalStartPosition, originalEndPosition);


这可以正常工作,但是SetRange()函数会影响richEditBox中文本的滚动位置,因为它会自动滚动以使文本的选定部分在屏幕上可见。因此,在所有颜色修改之后,richEditBox控件的滚动位置将被修改。

最终的SetRange()函数调用将光标置于其初始位置,而不是滚动位置。

所以,我的问题是:更改颜色后如何恢复richEditBox控件的滚动位置?或者如何在不影响滚动位置的情况下修改文本颜色?

最佳答案

看来这是设计使然。当将光标置于RichEditBox中时,我们可以滚动看不见光标的文本。使用SetRange方法后,它将滚动到我们设置光标的位置。如果光标在视图中,则不会滚动。

如果要滚动到设置的文本范围,则应该能够将PointOptions.Start设置为ScrollIntoView方法。它将滚动文本范围的末尾进入视图。

例如:

ITextSelection selection = MyRichEditBox.Document.Selection;
int originalStartPosition = selection.StartPosition;
int originalEndPosition = selection.EndPosition;
selection.SetRange(600, 610);
selection.CharacterFormat.ForegroundColor = Colors.Red;
selection.SetRange(originalStartPosition, originalEndPosition);
selection.ScrollIntoView(PointOptions.Start);


编辑代码:

ITextSelection selection = MyRichEditBox.Document.Selection;
int originalStartPosition = selection.StartPosition;
int originalEndPosition = selection.EndPosition;
selection.SetRange(600, 610);
selection.ScrollIntoView(PointOptions.Start);
await Task.Delay(2000);
selection.CharacterFormat.ForegroundColor = Colors.Red;
selection.SetRange(originalStartPosition, originalEndPosition);

10-08 02:16