我使用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 控件的滚动位置?或者如何在不影响滚动位置的情况下修改文本颜色?
答案 0 :(得分:0)
似乎是设计上的。当我们在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);