I have a RichTextBox that I am searching. When the search result is selected the text is then highlighted correctly. However, once the RichTextBox is scrolled, the highlight does not follow the text that was highlighted, but instead stays where the text was initially found (see attached screenshot). Below is the code that highlights the desired text initially. Any thoughts on how to get the highlight to follow the text as it is scrolled?
01.
class
SearchResult
02.
{
03.
public
string
Display {
get
;
set
; }
04.
public
TextPointer Start {
get
;
set
; }
05.
public
TextPointer End {
get
;
set
; }
06.
}
07.
08.
public
void
DoSearch()
09.
{
10.
string
toSearch = TextBox_Find.Text.Replace(@
"\", @"
\\")
11.
.Replace(
"^"
, @
"\^"
)
12.
.Replace(
"$"
, @
"\$"
)
13.
.Replace(
"."
, @
"\."
)
14.
.Replace(
"|"
, @
"\|"
)
15.
.Replace(
"?"
, @
"\?"
)
16.
.Replace(
"*"
, @
"\*"
)
17.
.Replace(
"+"
, @
"\+"
)
18.
.Replace(
"("
, @
"\("
)
19.
.Replace(
")"
, @
"\)"
)
20.
.Replace(
"["
, @
"\["
)
21.
.Replace(
"]"
, @
"\]"
)
22.
.Replace(
"{"
, @
"\{"
)
23.
.Replace(
"}"
, @
"\}"
);
24.
TextRange range =
new
TextRange(RichTextBox_AllComments.Document.ContentStart, RichTextBox_AllComments.Document.ContentEnd);
25.
Regex reg =
new
Regex(toSearch, RegexOptions.Compiled | RegexOptions.IgnoreCase);
26.
27.
var start = RichTextBox_AllComments.Document.ContentStart;
28.
while
(start !=
null
&& start.CompareTo(RichTextBox_AllComments.Document.ContentEnd) < 0)
29.
{
30.
if
(start.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
31.
{
32.
var matches = reg.Matches(start.GetTextInRun(LogicalDirection.Forward));
33.
TextRange textrange =
null
;
34.
foreach
(Match match
in
matches)
35.
{
36.
textrange =
new
TextRange(start.GetPositionAtOffset(match.Index, LogicalDirection.Forward), start.GetPositionAtOffset(match.Index + match.Length, LogicalDirection.Backward));
37.
SearchResults.Add(
new
SearchResult() { Display =
"Result "
+ (SearchResults.Count + 1).ToString(), Start = textrange.Start, End = textrange.End });
38.
}
39.
if
(textrange !=
null
) start = textrange.End;
40.
}
41.
start = start.GetNextContextPosition(LogicalDirection.Forward);
42.
}
43.
}
44.
45.
private
void
ListBox_Find_SelectionChanged(
object
sender, SelectionChangedEventArgs e)
46.
{
47.
if
(e.AddedItems.Count > 0)
48.
{
49.
bFindItemSelected =
true
;
50.
SearchResult sr = e.AddedItems[0]
as
SearchResult;
51.
RichTextBox_AllComments.Focus();
52.
RichTextBox_AllComments.Selection.Select(sr.Start, sr.End);
53.
((UIElement)ListBox_Find.ItemContainerGenerator.ContainerFromItem(ListBox_Find.SelectedItem)).Focus();
54.
}
55.
}