我将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);