Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用RichEditBox设置富文本格式_C#_Uwp - Fatal编程技术网

C# 使用RichEditBox设置富文本格式

C# 使用RichEditBox设置富文本格式,c#,uwp,C#,Uwp,我使用RichEditBox作为富文本编辑器:当用户在RichEditBox控件中键入文本时,我对文本中的不同关键字使用不同的颜色 在进行更改之前,我保存当前选择位置: ITextSelection selection = richEditBox.Document.Selection; int originalStartPosition = selection.StartPosition; int originalEndPosition = selection.EndPosition; sel

我使用RichEditBox作为富文本编辑器:当用户在RichEditBox控件中键入文本时,我对文本中的不同关键字使用不同的颜色

在进行更改之前,我保存当前选择位置:

ITextSelection selection = richEditBox.Document.Selection;
int originalStartPosition = selection.StartPosition;
int originalEndPosition = selection.EndPosition;
selection.SetRange(originalStartPosition, originalEndPosition);
然后我更改文本某些部分的颜色,例如:

selection.SetRange(startIndex, stopIndex);
selection.CharacterFormat.ForegroundColor = Colors.Red;
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 = richEditBox.Document.Selection;
int originalStartPosition = selection.StartPosition;
int originalEndPosition = selection.EndPosition;
selection.SetRange(originalStartPosition, originalEndPosition);
这可以正常工作,但SetRange()函数会影响richEditBox中文本的滚动位置,因为它会自动滚动以使文本的选定部分在屏幕上可见。因此,在所有颜色修改之后,richEditBox控件的滚动位置将被修改

最终的SetRange()函数调用将光标放在初始位置,但不放在滚动位置


因此,我的问题是:在更改颜色后,如何恢复richEditBox控件的滚动位置?或者如何在不影响滚动位置的情况下修改文本颜色?

这似乎是出于设计。当我们在
RichEditBox
中设置光标时,我们可以滚动看不到光标的文本。使用
SetRange
方法后,它将滚动到设置光标的位置。如果光标在视图中,它将不会滚动

如果要滚动到设置的文本范围,应能够将
PointOptions.Start
设置为该方法。它将滚动文本范围的末尾进入视图

例如:

selection.SetRange(startIndex, stopIndex);
selection.CharacterFormat.ForegroundColor = Colors.Red;
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);

这很奇怪,因为你是说第一个“设置范围”滚动,而第二个没有滚动——或者你的意思是,第二个范围仍然在视图中?然后你可以看看这个:因为随着时间的推移,再次向上滚动会变得非常难看。SetRange()函数不会滚动到初始位置,只是为了让选择在屏幕上可见。然后我想参考我写了一个链接的已经回答的另一个问题。我想隐藏选择应该可以解决问题。谢谢你的链接,但我正在制作一个UWP应用程序,所以你提到的方法不适合。这应该以一种更简单的方式完成,或者根本不可能完成。对不起,我忽略了uwp标签。但是如果你确定链接中的其他方法不起作用,我认为没有一个简单的解决方案。无论如何,我对uwp不是很熟悉,所以我可能是错的。谢谢你的意见!问题是ScrollIntoView()滚动到的位置与调用第一个SetRange()之前的编辑器滚动位置不同。在一系列将光标位置移出视图的SetRange()调用之后,final ScrollIntoView()会将光标位置带回屏幕,但不会返回到开始时的位置,而是返回到光标刚刚可见的位置。但是,当用户键入文本时,这种情况会实时发生,这会导致无法预测的文本跳转。请尝试添加延迟方法“wait Task.delay(2000);”在设置颜色之前,它将滚动到第一个SetRandge位置,然后更改颜色。最后,它将滚动到您选择的范围。似乎我们应该能够在第一次设置范围之后将
滚动到视图中。查看我的编辑代码。