私はこのWPFのRichTextBoxを持っていると私はプログラム的に文字/単語の与えられた範囲を選択し、それを強調表示します。私はこれを試しましたが、うまくいきません。なぜなら、いくつかの隠されたFlowDocumentタグなどを考慮していないからです。例えば、私は)文字3-8を選択したいが、2-6が選択されます:私が得た:選択範囲(FlowDocument)プログラム
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);
私はRichTextBoxの処理を実現してきたことは、私は:)
更新を考えていたよりも少し複雑ですMSDNフォーラムには、いくつかの答え:This thread「dekurver」SEID:
あなたが指定しているオフセットは 文字オフセットが、シンボルオフセットではありません。あなたがする必要がどのような は、あなたが知っている のTextPointerがテキストに 隣接している取得、その後、あなたは文字 オフセットを追加することができます。
そして「LesterLoboは、」言った:
あなたが のすべての外観を申請するループ で 次、次にそのオフセットを見つけるために 段落やインラインをループにする必要があります特定のテキストあなたが移動する あなたのテキストを編集するが、ときに ハイライトはオフセットない テキストに関連付けられているその として動くwouldntのことに注意してください。ただしEDIT
...
はまだ誰かがFlowDocumentsの周りに彼らの方法を知っている場合は、このためのいくつかのサンプルコードを見てみたい... カスタムランを作成し、 のためにそれをハイライトを提供することができ
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;
}
そして、私はこのようにそれを使用します:私が働いてKratz VBコードのバージョンを持って、それはこのようになります
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);
}
ニース!私はそのコードのバージョンが動作している、それを質問に追加します。乾杯。 –
これは、RichTextBoxの文字をカウントするのにも便利です: 'out'がヌルでないときにループを行い、最後に' i'を返します。 – devios1
このメソッドは、私が指定したトークンの後に来るすべての文字を取得します。私はそれが私のトークンのポインタを取得する必要があるだけです。私のトークンを操作するだけです!ビジュアルスタジオのような – a7madx7