你好,
我有以下问题 - 以下文本位于富文本框中。
今天的世界[[精彩]]。
如果用户在一个词的前后提供了两个括号,如wonder,括号中的词,在这种情况下,wonder会变成一个链接,(绿色)。
我在获取击键顺序时遇到问题,即。我怎么知道用户输入了 [[ ,所以我可以开始解析它后面的其余文本。
我可以通过处理 KeyDown、事件和列表来获得它,但它看起来一点也不优雅。
请让我知道什么应该是正确的方法。
谢谢, 苏杰
你有两种我能想到的方法。
一个是,正如你所建议的,用一个列表来维护当前状态——这个键是一个括号吗?最后一个键是括号吗? - 并即时更新。
另一种方法是简单地处理 TextChanged 事件并重新扫描文本以查找 [[text-here]] 模式并根据需要进行更新。
第一个需要更多的簿记,但对于较长的文本会更快。第二种方法更容易,可能可以用一个像样的正则表达式来完成,但随着你的文本变长,它会变慢。如果你知道你有一些上限,比如 256 个字符,那么你可能没问题。但如果你期待小说,可能不是一个好主意。
我会推荐 Google'ing:“richtextbox 语法荧光笔”,有很多人已经这样做了,并且有很多幕后工作让它发挥作用。
我敢说,每一个简单的解决方案都有很大的缺点。正确的方法是使用一些已经执行此“语法突出显示”的控件并将其扩展到您的语法。这也很可能是最简单的方法。
您可以在 Codeplex 中搜索免费的 .net 控件。关联
我会尝试处理 KeyDown,并检查右括号而不是“]”。收到后,您可以检查文本框中的最后一个字符是否为第二个 ],如果存在,只需替换最后几个字符。
这消除了维护状态(即:列表)的需要。输入第二个 ] 后,该块将立即变为链接。
(对不起,还没有足够的声誉来添加评论,所以必须添加一个新的答案)。正如 jeffamaphone 所建议的那样,我会处理 TextChanged 事件并每次重新扫描文本 - 但为了保持成本不变,只需扫描当前光标位置之前的几个字符,而不是阅读整个文本。
试图拦截击键并保持内部状态是一种不好的方法 - 您很容易了解发生的事情与您正在监视的控件不同步并导致奇怪的问题。(你如何处理点击?Alt-tab?粘贴?箭头键?其他应用程序抓住焦点?太多特殊情况需要担心......)
我认为保留一份清单会相当复杂。如果用户键入一个“[”字符,单击文本中的其他位置,然后再次键入一个“[”字符会怎样。用户随后键入了两个连续的“[”字符,但在文本的完全不同的部分。此外,您可能还希望能够处理从剪贴板插入的文本。
我认为最安全的方法是分析全文并使用 RegEx 或其他一些技术从该上下文中做应该做的事情。