2016-07-06 19 views
2

RichTextboxの文字列を特定の位置と特定の色で挿入したいとします。そこで、RichTextboxクラスのメソッドAppendText()の拡張を追加しようとしました。リッチテキストボックス内の特定の色で特定のインデックスにテキストを挿入します

public static void AppendText(this RichTextBox Box, string Text, Color col, int SelectionStart) 
{ 
    Box.SelectionStart = SelectionStart; 
    Box.SelectionLength = 0; 

    Box.SelectionColor = col; 
    Box.SelectionBackColor = col; 
    Box.Text = Box.Text.Insert(SelectionStart, Text); 
    Box.SelectionColor = Box.ForeColor; 
} 

私はこれをRichTextBoxExtensionというクラスで使用しようとしました。結果は私の期待どおりではありません。文字列は挿入されますが、選択された色は挿入されません。 この機能を実行する方法はありますか?

編集:この機能が必要な理由をお知らせするのは興味深いと思います。実際には、ユーザーが閉じ括弧を書くとき、私は連想の開始括弧をハイライト(またはカラー)したいと思います。 たとえば、ユーザーが(Mytext)を書き込む場合、ユーザーが「)」をタップしたときに最初の括弧が色付けされ、この括弧の上に選択が保持されます。

+2

すべての書式が失われることになります:

あなたのコードは、この(私はハンスをほのめかしたものを離れて与える)のようになります。代わりにSelectionTextプロパティを割り当てる必要があります。 SelectionStartプロパティとSelectionLengthプロパティを復元する必要があります。あなたは自分で色の選択のバグを発見します。 –

+0

私はそれがWinFormsの質問だと知っていますが、WPF-o-sphereから誰かが遭遇した場合、 'Document'プロパティを使ってRichTextBoxの基礎となる' FlowDocument'に簡単にアクセスできます。 - これははるかに強力な編集APIを持っています(また、スペルチェックなどの他の高度な機能のために、WinFormsエディタより優先されるべきです)。 - WinFormsに閉じ込められている場合は、WPF Rich Textエディタを「ElementHost」コントロールでホストすることを検討する価値があります。 – BrainSlugs83

答えて

1

RichTextBoxコントロールのSelectedTextプロパティを使用する必要があります。また、何かを変更する前に、現在の選択項目の値を確認してください。 Textプロパティを設定する

public static void AppendText(this RichTextBox Box, 
           string Text,  
           Color col, 
           int SelectionStart) 
{ 
    // keep all values that will change 
    var oldStart = Box.SelectionStart; 
    var oldLen = Box.SelectionLength; 

    // 
    Box.SelectionStart = SelectionStart; 
    Box.SelectionLength = 0; 

    Box.SelectionColor = col; 
    // Or do you want to "hide" the text? White on White? 
    // Box.SelectionBackColor = col; 

    // set the selection to the text to be inserted 
    Box.SelectedText = Text; 

    // restore the values 
    // make sure to correct the start if the text 
    // is inserted before the oldStart 
    Box.SelectionStart = oldStart < SelectionStart ? oldStart : oldStart + Text.Length; 
    // overlap? 
    var oldEnd = oldStart + oldLen; 
    var selEnd = SelectionStart + Text.Length; 
    Box.SelectionLength = (oldStart < SelectionStart && oldEnd > selEnd) ? oldLen + Text.Length : oldLen; 
} 
+0

ご協力いただきありがとうございます!私はこの解決策を試し、あなたにできるだけ早くフィードバックを与えます。 selectedTextというプロパティは、実際には色を変更したいテキストですか?また、私はこのテキスト上にカーソルを置きますか?実際には、例えば、 ")"と書いたときに "(myvalue)"と書いていれば、括弧 "("が強調表示されますが、何かを書き続けても "私の質問が明確でない場合は、私に教えてください。間違って申し訳ありません、私は英語が完璧ではないことを知っています^^ ' – Seraphon91

関連する問題