Я скопировал следующий код из документации MSDN метода TextRange.Select , заменил RichTextBox на FlowDocumentScrollViewer, и он работает, как и ожидалось. Как вы определили свои TextPointers? Это кажется наиболее вероятной причиной вашей проблемы.
ОБНОВЛЕНИЕ: я обновил свой код, чтобы включить ваш алгоритм выбора, и он все еще работает. Единственное, что я знаю о том, чтобы делать по-другому, это «перерыв» после выбора. В противном случае он будет выбираться с начала первого вхождения searchText до конца последнего вхождения. Кроме этого, я мог бы предположить, что ваш searchText может вообще не быть включен в ваш документ (возможно, проблема с регистром?), Но это только предположение. Вы отлаживали свой код? Являются ли TextPointers действительными (не нулевыми и т. Д.) При попытке выделить текст?
XAML:
<FlowDocumentScrollViewer GotMouseCapture="richTB_GotMouseCapture" Name="richTB">
<FlowDocument>
<Paragraph Name="myParagraph">
<Run>
When the user clicks in the RichTextBox, the selected text changes programmatically.
</Run>
</Paragraph>
</FlowDocument>
</FlowDocumentScrollViewer>
Код:
private void richTB_GotMouseCapture(object sender, MouseEventArgs e)
{
string searchText = "text";
TextPointer pointer = richTB.Document.ContentStart;
while (pointer != null)
{
if (pointer.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
{
string textRun = pointer.GetTextInRun(LogicalDirection.Forward);
// where textRun is the text in the flowDocument
// and searchText is the text that is being searched for
int indexInRun = textRun.IndexOf(searchText);
if (indexInRun >= 0)
{
TextPointer startPos = pointer.GetPositionAtOffset(indexInRun);
TextPointer endPos = pointer.GetPositionAtOffset(indexInRun + searchText.Length);
richTB.Selection.Select(startPos, endPos);
break;
}
}
pointer = pointer.GetNextContextPosition(LogicalDirection.Forward);
}
}