Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在用户书写时在RichTextBox中使用不同颜色为不同的单词着色,并在单击该彩色文本时引发事件_C#_Winforms_Richtextbox - Fatal编程技术网

C# 如何在用户书写时在RichTextBox中使用不同颜色为不同的单词着色,并在单击该彩色文本时引发事件

C# 如何在用户书写时在RichTextBox中使用不同颜色为不同的单词着色,并在单击该彩色文本时引发事件,c#,winforms,richtextbox,C#,Winforms,Richtextbox,当用户在富文本框中写入某些单词时,若该单词和某个特定单词匹配,则该单词的颜色应自动更改。 当用户单击特定的彩色文本时,它应该引发一个事件 首先,将事件添加到您的富文本框中,然后 如果文本是一个特定的词,例如:Munis,Ali,则需要更改文本的颜色 private void Rchtxt_TextChanged(object sender, EventArgs e) { this.CheckKeyword("Munis", Color

当用户在富文本框中写入某些单词时,若该单词和某个特定单词匹配,则该单词的颜色应自动更改。


当用户单击特定的彩色文本时,它应该引发一个事件

首先,将事件添加到您的富文本框中,然后 如果文本是一个特定的词,例如:Munis,Ali,则需要更改文本的颜色

   private void Rchtxt_TextChanged(object sender, EventArgs e)
            {
                this.CheckKeyword("Munis", Color.Purple, 0);
                this.CheckKeyword("Ali", Color.Green, 0);
            }

首先,将事件添加到您的富文本框中,然后 如果文本是一个特定的词,例如:Munis,Ali,则需要更改文本的颜色

   private void Rchtxt_TextChanged(object sender, EventArgs e)
            {
                this.CheckKeyword("Munis", Color.Purple, 0);
                this.CheckKeyword("Ali", Color.Green, 0);
            }

鉴于要求:

1)用户在RichTextBox控件中插入一些文本。
2)如果输入的单词是预定义单词列表的一部分,则该单词应更改颜色(因此,定义单词和颜色之间的关系)。
3)在彩色单词上生成鼠标单击事件时,会引发一个事件,以通知单击了哪个单词

可能的结果(复制视觉示例中的内容):

使用自定义EventArgs定义自定义EventHandler:

public class WordsEventArgs : EventArgs
{
    private string m_word;
    public WordsEventArgs(string word) { m_word = word; }
    public string Word { get { return m_word; } set { m_word = value; } }
}

public delegate void WordsEventHandler(object sender, WordsEventArgs e);
public event WordsEventHandler WordClicked;

protected void OnWordClicked(WordsEventArgs e) => WordClicked?.Invoke(this, e);
订阅活动:

this.WordClicked += new WordsEventHandler(this.Word_Click);
单词列表的简单类:

public class ColoredWord
{
    public string Word { get; set; }
    public Color WordColor { get; set; }
}

public List<ColoredWord> ColoredWords = new List<ColoredWord>();
按键
事件中,评估最后输入的单词是否属于要着色的单词列表的一部分:

private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    int currentPosition = richTextBox1.SelectionStart;

    if (e.KeyChar == (char)Keys.Space && currentPosition > 0 && richTextBox1.Text.Length > 1) {
        int lastSpacePos = richTextBox1.Text.LastIndexOf((char)Keys.Space, currentPosition - 1);
        lastSpacePos = lastSpacePos > -1 ? lastSpacePos + 1 : 0;

        string lastWord = richTextBox1.Text.Substring(lastSpacePos, currentPosition - (lastSpacePos));
        ColoredWord result = ColoredWords.FirstOrDefault(s => s.Word == lastWord.ToUpper());

        richTextBox1.Select(lastSpacePos, currentPosition - lastSpacePos);
        if (result != null) {
            if (richTextBox1.SelectionColor != result.WordColor) { 
                richTextBox1.SelectionColor = result.WordColor;
            }
        }
        else {
            if (richTextBox1.SelectionColor != richTextBox1.ForeColor) { 
                richTextBox1.SelectionColor = richTextBox1.ForeColor;
            }
        }
        richTextBox1.SelectionStart = currentPosition;
        richTextBox1.SelectionLength = 0;
        richTextBox1.SelectionColor = richTextBox1.ForeColor;
    }
}
MouseClick
事件中,验证事件是否在彩色单词上生成。
在这种情况下,引发自定义
OnWordClicked()
事件:

private void richTextBox1_MouseClick(object sender, MouseEventArgs e)
{
    if (richTextBox1.SelectionColor.ToArgb() != richTextBox1.ForeColor.ToArgb()) {
        try {
            int wordInit = richTextBox1.Text.LastIndexOf((char)32, richTextBox1.SelectionStart);
            wordInit = wordInit > -1 ? wordInit : 0;
            int wordEnd = richTextBox1.Text.IndexOf((char)32, richTextBox1.SelectionStart);
            string wordClicked = richTextBox1.Text.Substring(wordInit, wordEnd - wordInit) + Environment.NewLine;
            OnWordClicked(new WordsEventArgs(wordClicked));
        }
        catch (Exception) {
            //Handle a fast DoubleClick: RTB is a bit dumb.
            //Handle a word auto-selection that changes the `.SelectionStart` value
        }
    }
}
在自定义事件中,您可以将单击的单词附加到文本框中(或执行任何其他操作):


鉴于要求:

1)用户在RichTextBox控件中插入一些文本。
2)如果输入的单词是预定义单词列表的一部分,则该单词应更改颜色(因此,定义单词和颜色之间的关系)。
3)在彩色单词上生成鼠标单击事件时,会引发一个事件,以通知单击了哪个单词

可能的结果(复制视觉示例中的内容):

使用自定义EventArgs定义自定义EventHandler:

public class WordsEventArgs : EventArgs
{
    private string m_word;
    public WordsEventArgs(string word) { m_word = word; }
    public string Word { get { return m_word; } set { m_word = value; } }
}

public delegate void WordsEventHandler(object sender, WordsEventArgs e);
public event WordsEventHandler WordClicked;

protected void OnWordClicked(WordsEventArgs e) => WordClicked?.Invoke(this, e);
订阅活动:

this.WordClicked += new WordsEventHandler(this.Word_Click);
单词列表的简单类:

public class ColoredWord
{
    public string Word { get; set; }
    public Color WordColor { get; set; }
}

public List<ColoredWord> ColoredWords = new List<ColoredWord>();
按键
事件中,评估最后输入的单词是否属于要着色的单词列表的一部分:

private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    int currentPosition = richTextBox1.SelectionStart;

    if (e.KeyChar == (char)Keys.Space && currentPosition > 0 && richTextBox1.Text.Length > 1) {
        int lastSpacePos = richTextBox1.Text.LastIndexOf((char)Keys.Space, currentPosition - 1);
        lastSpacePos = lastSpacePos > -1 ? lastSpacePos + 1 : 0;

        string lastWord = richTextBox1.Text.Substring(lastSpacePos, currentPosition - (lastSpacePos));
        ColoredWord result = ColoredWords.FirstOrDefault(s => s.Word == lastWord.ToUpper());

        richTextBox1.Select(lastSpacePos, currentPosition - lastSpacePos);
        if (result != null) {
            if (richTextBox1.SelectionColor != result.WordColor) { 
                richTextBox1.SelectionColor = result.WordColor;
            }
        }
        else {
            if (richTextBox1.SelectionColor != richTextBox1.ForeColor) { 
                richTextBox1.SelectionColor = richTextBox1.ForeColor;
            }
        }
        richTextBox1.SelectionStart = currentPosition;
        richTextBox1.SelectionLength = 0;
        richTextBox1.SelectionColor = richTextBox1.ForeColor;
    }
}
MouseClick
事件中,验证事件是否在彩色单词上生成。
在这种情况下,引发自定义
OnWordClicked()
事件:

private void richTextBox1_MouseClick(object sender, MouseEventArgs e)
{
    if (richTextBox1.SelectionColor.ToArgb() != richTextBox1.ForeColor.ToArgb()) {
        try {
            int wordInit = richTextBox1.Text.LastIndexOf((char)32, richTextBox1.SelectionStart);
            wordInit = wordInit > -1 ? wordInit : 0;
            int wordEnd = richTextBox1.Text.IndexOf((char)32, richTextBox1.SelectionStart);
            string wordClicked = richTextBox1.Text.Substring(wordInit, wordEnd - wordInit) + Environment.NewLine;
            OnWordClicked(new WordsEventArgs(wordClicked));
        }
        catch (Exception) {
            //Handle a fast DoubleClick: RTB is a bit dumb.
            //Handle a word auto-selection that changes the `.SelectionStart` value
        }
    }
}
在自定义事件中,您可以将单击的单词附加到文本框中(或执行任何其他操作):


首先,谢谢,这对我来说很有用。有一个问题,如果我们键入列表框中的单词,则颜色更改但单击事件不起作用,例如:-如果您首先编写简单,则颜色更改但单击事件不起作用(文本框中看不到该简单单词)例外情况是:-开始索引不能小于零。参数名称:开始Index@user8015165您是对的,
richTextBox1\u MouseClick()
事件中有一个bug。我添加了一行检查初始文本限制的代码。如果您发现其他错误,请告诉我。再次感谢,它正在工作。如果我有任何问题,我会通知你。首先,谢谢,这对我来说很有用。有一个问题,如果我们键入列表框中的单词,则颜色更改但单击事件不起作用,例如:-如果您首先编写简单,则颜色更改但单击事件不起作用(文本框中看不到该简单单词)例外情况是:-开始索引不能小于零。参数名称:开始Index@user8015165您是对的,
richTextBox1\u MouseClick()
事件中有一个bug。我添加了一行检查初始文本限制的代码。如果您发现其他错误,请告诉我。再次感谢,它正在工作。如果我有任何问题,我会通知你。