Mam ten RichTextBox WPF i chcę programowo wybrać dany zakres liter/słów i zaznacz go. Próbowałem tego, ale to nie działa, prawdopodobnie dlatego, że nie biorę pod uwagę niektórych ukrytych tagów FlowDocument lub podobnych. Na przykład, chcę zaznaczyć litery 3-8 ale 2-6 zostanie wybrany):Wybierz zakres tekstu w RichTextBox WPF (FlowDocument) Programowo
var start = MyRichTextBox.Document.ContentStart;
var startPos = start.GetPositionAtOffset(3);
var endPos = start.GetPositionAtOffset(8);
var textRange = new TextRange(startPos,endPos);
textRange.ApplyPropertyValue(TextElement.ForegroundProperty,
new SolidColorBrush(Colors.Blue));
textRange.ApplyPropertyValue(TextElement.FontWeightProperty,
FontWeights.Bold);
Uświadomiłem sobie manipulacja RichTextBox jest nieco trudniejsze niż myślałem :)
Update: Dostałem kilka odpowiedzi na forach MSDN: This thread gdzie „dekurver” Seid:
przesunięcia jesteś określające nie są offsety charakter, ale przesunięcia symbolu. Co trzeba zrobić, to uzyskać wiadomość tekstową , która jest w sąsiedztwie , a następnie można dodać przesunięcia znaków .
i „LesterLobo” powiedział:
trzeba będzie pętli przez akapitów i inlines znaleźć Dalej, a następnie ich przesunięcia w pętli ubiegać się o wszystkich występach Spośród określony tekst. Zwróć uwagę, że tekst został zmieniony, ale Twój tekst nie byłby przesunięty, ponieważ jego znacznik nie byłby przenoszony jako powiązany z przesunięciem, a nie z tekstem . Można jednak utworzyć własny bieg i zapewniają Okładka to ...
nadal kochałbym zobaczyć przykładowy kod dla tego, jeśli ktoś zna swoją drogę FlowDocuments ...
EDIT mam wersję kodu Kratz VB działa, wygląda to tak:
private static TextPointer GetPoint(TextPointer start, int x)
{
var ret = start;
var i = 0;
while (i < x && ret != null)
{
if (ret.GetPointerContext(LogicalDirection.Backward) ==
TextPointerContext.Text ||
ret.GetPointerContext(LogicalDirection.Backward) ==
TextPointerContext.None)
i++;
if (ret.GetPositionAtOffset(1,
LogicalDirection.Forward) == null)
return ret;
ret = ret.GetPositionAtOffset(1,
LogicalDirection.Forward);
}
return ret;
}
i używam go tak:
Colorize(item.Offset, item.Text.Length, Colors.Blue);
private void Colorize(int offset, int length, Color color)
{
var textRange = MyRichTextBox.Selection;
var start = MyRichTextBox.Document.ContentStart;
var startPos = GetPoint(start, offset);
var endPos = GetPoint(start, offset + length);
textRange.Select(startPos, endPos);
textRange.ApplyPropertyValue(TextElement.ForegroundProperty,
new SolidColorBrush(color));
textRange.ApplyPropertyValue(TextElement.FontWeightProperty,
FontWeights.Bold);
}
Nice! Mam działającą wersję tego kodu, doda go do pytania. Twoje zdrowie. –
Jest to również przydatne do zliczania znaków w RichTextBox: po prostu wykonaj pętlę, gdy 'out' nie jest pusta i zwróć' i' na końcu. – devios1
Ta metoda pobiera mi każdą postać, która pojawia się po którymś z podanych przeze mnie tokenów, więc potrzebuję go, aby uzyskać wskaźnik do mojego słowa tylko dlatego, że kiedy próbuję zrobić to pogrubieniem, na przykład, robi to całe zdanie po moim tokenie "pogrubiony" i po prostu potrzebuję go do działania na moim tokenie! – a7madx7