2017-03-20 36 views
1

我使用RichEditBox作为富文本编辑器:我在文本中为不同的关键字使用不同的颜色,而用户在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控件。

Final SetRange()函数调用将光标置于其初始位置,但不是滚动位置。

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

+0

这是奇怪的,因为你说的第一个'SetRange'滚动,但第二次却没有 - 或者你的意思是,第二个范围仍在观察中?然后你可以看看这个: http://stackoverflow.com/questions/626988/prevent-autoscrolling-in-richtextbox 因为再次滚动变得非常难看时间。 – MetaColon

+0

SetRange()函数不滚动到初始位置,而只是为了使选择在屏幕上可见。 – Kibernetik

+0

然后我只想引用已经回答的其他问题,我写了一个链接。我想隐藏选择应该解决问题。 – MetaColon

回答

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); 
+0

谢谢您的输入!问题是ScrollIntoView()不会滚动到编辑器在调用第一个SetRange()之前的同一个滚动位置。在将光标位置移出视图的一系列SetRange()调用之后,最终的ScrollIntoView()会将光标位置移回屏幕,但不会返回到开始位置,而是光标刚好可见的位置。但是,当用户输入文本时,实时发生这种情况会导致不可预知的文本跳转。 – Kibernetik

+0

请尝试添加延迟方法'await Task.Delay(2000);'在设置颜色之前,它将滚动到第一个SetRandge位置,然后更改颜色。最后它会滚动到您选择的范围。看来我们应该能够在第一个SetRange之后移动ScrollIntoView。查看我的编辑代码。 –