2016-07-06 116 views
2

我想在我的RichTextbox中,特定位置和特定顏色中插入一個字符串。所以我試着爲RichTextbox類的方法AppendText()添加一個擴展。在RichTextbox中使用特定顏色在特定索引處插入文本

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

設置Text屬性將導致丟失所有格式。您必須改爲指定SelectionText屬性。恢復SelectionStart和SelectionLength屬性是必需的。你會發現你自己的顏色選擇錯誤。 –

+0

我知道這是一個WinForms問題,但如果有人從WPF-o-sphere失敗,可以使用'Document'屬性很容易地訪問RichTextBox的底層'FlowDocument'。 - 這有一個更強大的編輯API(並且應該優先於WinForms編輯器,其他高級功能如拼寫檢查等)。 - 如果您被困在WinForms中,可能值得考慮在'ElementHost'控件中託管WPF Rich Text編輯器。 – BrainSlugs83

回答

1

您必須使用RichTextBox控件的SelectedText屬性。在更改任何內容之前,請確保跟蹤當前選擇的值。

您的代碼應該是這樣的(我放棄什麼漢斯在被暗示):

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