【问题标题】:clickable text in richtextbox富文本框中的可点击文本
【发布时间】:2015-04-13 23:42:55
【问题描述】:

我想通过 c# 中的代码制作一个可点击的文本(它不是 URL,只是普通文本),所以当我点击该文本时,它会执行 linkclicked 事件。 它是用于字典的,所以当我搜索某些内容时,在描述中有一个与存储相同的词,我可以单击它来搜索该词。

for (int j = 0; j <= jml[i]; j++)
        {
            richTextBox4.AppendText(j + 1 + ". ");
            string[] desk = sk[i, j].Split(' ');
            for (int l = 0; l < desk.Count(); l++)
            {
                for (int m = 0; m < kata.Count(); m++)
                {
                    if (desk[l] == kata[m])
                    {
                        richTextBox4.SelectionColor = Color.Blue;
                        desk[l] = LinkArea;
                    }
                }
                richTextBox4.AppendText(desk[l] + " ");
                richTextBox4.SelectionColor = Color.Black; 
            }
            richTextBox4.AppendText("\n");

        }

我目前的代码(对于超链接类型的文本,只是有效的颜色)

【问题讨论】:

  • 你有什么问题?
  • 如何制作没有 www 的可点击文本。在它面前
  • 您的问题解决了吗?

标签: c# richtextbox


【解决方案1】:

没有内置方法,但如果您知道自己想要什么,构建起来并不难。

  • 第一步是确定可点击文本是如何定义的,阅读:分隔符是什么?

    • 如果你想要单个单词,这很容易。一种方法是使用正则表达式来识别 RTB 中的单词。如果您不喜欢定义单词的内置方式,我可以发布带有用户定义分隔符的代码。但也许您对已有的内容感到满意。
    • 如果您需要将整个短语(包括空格)作为一个整体进行点击,那么您就必须更有创造力:
    • 您可以在短语周围添加特殊字符
    • 或者您可以用不可破坏的空格替换空格
    • 或者你可以在你的文本中写一个完整的地图,但这可能违背了你的目的。

    • 除了简单的单词之外的任何内容都意味着您需要对文本进行一些更改。

结果应该是一个可以找到可点击文本的开头和结尾并返回点击的单词/短语的函数。

  • 第二步是在Dictionary&lt;string, string&gt; 中查找文本,然后对值执行您想要执行的操作,例如在标签中显示翻译:

if (dictEnGE.ContainsKey(theClickedWord)) 
    label.Text = dictEnGE[theClickedWord];
  • 为此,您必须首先通过添加键值对来准备字典:键是可点击的文本,值是您需要查找的任何内容:

Dictionary<string, string> dictEnGE = new Dictionary<string, string>();
dictEnGE.Add("house", "Haus");
dictEnGE.Add("man", "Mann");
dictEnGE.Add("mouse", "Maus");
//..

所以整个解决方案是:准备一个字典,对 Mouseclick 事件进行编码以查找被点击的文本,在字典中查找文本,用你找到的值做你的事..

更新:这是一个获取点击单词的函数:

string getWordAtIndex(RichTextBox RTB, int index)
{
    string wordSeparators = " .,;-!?\r\n\"";
    int cp0 = index;
    int cp2 = RTB.Find(wordSeparators.ToCharArray(), index);
    for (int c = index; c > 0; c--)
    { if (wordSeparators.Contains(RTB.Text[c])) { cp0 = c + 1; break; } }
    int l = cp2 - cp0;
    if (l > 0) return RTB.Text.Substring(cp0, l); else return "";
}

你可以这样使用它:

private void richTextBox1_MouseClick(object sender, MouseEventArgs e)
{
    string word = getWordAtIndex(richTextBox1, richTextBox1.SelectionStart);
    if (dictEnGE.ContainsKey(word)) aLabel.Text = dictEnGE[word];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多