使用RichEditBox进行富文本格式化

时间:2017-03-20 16:38:40

标签: c# uwp

我使用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 控件的滚动位置?或者如何在不影响滚动位置的情况下修改文本颜色?

1 个答案:

答案 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);