【问题标题】:Rich text formatting using RichEditBox使用 RichEditBox 格式化富文本
【发布时间】:2017-03-22 10:03:47
【问题描述】:

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

【问题讨论】:

  • 这很奇怪,因为您是说第一个“SetRange”滚动,但第二个没有滚动 - 或者您的意思是,第二个范围仍在视图中?然后你可以看看这个:stackoverflow.com/questions/626988/… 因为随着时间的推移,再次向上滚动变得非常难看。
  • SetRange() 函数不会滚动到初始位置,而只是为了使选择在屏幕上可见。
  • 那么我只想参考已经回答的另一个问题,我写了一个链接。我想隐藏选择应该可以解决问题。
  • 感谢您的链接,但我正在制作 UWP 应用程序,因此您提到的方法不适合。这应该以更简单的方式完成,或者根本不可能完成。
  • 对不起,我忽略了 uwp 标签。但是,如果您确定链接中的其他方法不起作用,我认为没有简单的解决方案。反正我对 uwp 不是很熟悉,所以我可能是错的。

标签: c# uwp


【解决方案1】:

这似乎是设计使然。当我们将光标设置在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);

【讨论】:

  • 感谢您的意见!问题是 ScrollIntoView() 滚动到第一次调用 SetRange() 之前编辑器所在的滚动位置不同。在一系列将光标位置移出视图的 SetRange() 调用之后,最终的 ScrollIntoView() 将光标位置带回屏幕,但不是回到开始时的位置,而是光标刚刚可见的位置。但由于这是在用户输入文本时实时发生的,这会导致不可预测的文本跳转。
  • 请在设置颜色之前尝试添加延迟方法`await Task.Delay(2000);`,它将滚动到第一个SetRandge位置然后更改颜色。最后它将滚动到您选择的范围。看来我们应该能够在第一个 SetRange 之后移动 ScrollIntoView。查看我的编辑代码。
猜你喜欢
  • 2015-05-17
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多