在RichTextbox

时间:2016-07-06 07:54:22

标签: c# winforms 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),当用户点击时,第一个括号将是彩色的")"并保留此括号的选择。

1 个答案:

答案 0 :(得分:1)

您必须使用RichTextBox控件的SelectedText属性。还要确保在更改任何内容之前跟踪当前选择的值。

你的代码看起来应该是这样的(我放弃了Hans所暗示的):

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;  
}