Ich habe diese WPF RichTextBox und ich möchte einen bestimmten Bereich von Buchstaben/Wörtern programmgesteuert auswählen und markieren. Ich habe das versucht, aber es funktioniert nicht, wahrscheinlich, weil ich einige versteckte FlowDocument-Tags oder ähnliches nicht berücksichtige. Zum Beispiel möchte ich Buchstaben auszuwählen 3-8 aber 2-6 wird gewählt):Wählen Sie Textbereich in WPF RichTextBox (FlowDocument) Programmatisch
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);
I RichTextBox Handling realisiert haben, ist ein bisschen schwieriger, als ich dachte :)
Update: Ich habe ein wenige Antworten auf den MSDN-Foren: This thread wo "dekurver" sind:
Die Offsets Sie spezifizieren nicht Zeichen-Offsets aber Symbol-Offsets. Was Sie tun müssen, ist ein TextPointer, den Sie wissen, ist neben zu Text, dann können Sie Zeichen Offsets hinzufügen.
Und „LesterLobo“, sagte:
Sie eine Schleife durch die Absätze und inlines müssen die Weiter zu finden und ihre Offsets dann in einer Schleife für alle Erscheinungen des anzuwenden spezifischer Text. Beachten Sie, dass, wenn Sie bearbeiten Ihr Text würde sich bewegen, aber Ihre Highlight würde nicht bewegen, wie seine mit dem Offset nicht die Text zugeordnet. Sie könnten jedoch eine individuelle Lauf erstellen und ein Highlight für bieten sie ...
würde gerne noch einige Beispiel-Code für diese zu sehen, ob jemand ihren Weg weiß um FlowDocuments ...
EDIT ich habe eine Version von Kratz VB-Code arbeiten, sieht es wie folgt aus:
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;
}
Und ich benutze es wie folgt aus:
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);
}
Schön! Ich habe eine Version dieses Codes funktioniert, werde es der Frage hinzufügen. Prost. –
Dies ist auch praktisch, um die Zeichen in einer RichTextBox zu zählen: mache einfach die Schleife, während "out" nicht null ist, und gebe "i" am Ende zurück. – devios1
Diese Methode holt mich jedes einzelne Zeichen, das nach irgendeinem meiner spezifizierten Zeichen kommt, ich brauche es nur, um einen Zeiger auf mein Wort nur zu erhalten, wenn ich versuche es fett zu machen zum Beispiel macht es den ganzen Satz nach meinem Token "fett" i brauche es nur, um auf meinem Token zu operieren! – a7madx7