You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2022中.NET Framework 4.7的RichTextBox隐藏超链接引发SelectionStart异常及后续链接失效问题

VS2022中.NET Framework 4.7的RichTextBox隐藏超链接引发SelectionStart异常及后续链接失效问题

大家好,我是重新捡起来VB.NET的开发者——之前有VB6基础,但中间十几年没碰代码,现在用VS2022做基于.NET Framework 4.7的项目,遇到了RichTextBox的棘手问题,找了各种地方都没找到解决方案,想请教下大家。

问题场景与现象

  1. 一开始我做了个测试RTF文档,里面有4个普通超链接,在RichTextBox里点击每个链接都能正常触发LinkClicked事件,完全没问题。
  2. 但当我在第2和第3个链接之间插入隐藏超链接(也就是链接的实际URL和显示文本不一样,比如URL是https://welt.de,显示成“Click here”)之后,怪事就发生了:
    • 这个隐藏超链接本身显示正常,但只要把光标移到它的显示文本上,rtfbox.SelectionStart就会出现完全不符合预期的数值;
    • 原来的第4个链接(现在变成第5个)再也触发不了LinkClicked事件了,点了完全没反应。
  3. 我还用MS Word做了对照测试:先建4个正常链接的文档存成RTF,在我的RichTextBox里打开完全正常;但在Word里插入隐藏超链接再存成RTF,用RichTextBox打开后,同样出现后续链接失效、SelectionStart数值异常的问题——但在Word里所有链接都能通过Ctrl+Click正常打开。

我生成隐藏超链接的代码

我是用这段VB代码生成隐藏超链接的RTF片段,然后赋值给RichTextBox的SelectedRtf的:

Dim linkURL as string = "https://welt.de"
Dim LinkDescription as string = "Click here"
Dim rtflink As String = "{\rtf1\ansi{\fonttbl{\f0\fcharset0 " & fontName & ";}}<" & "{\field{\*\fldinst{HYPERLINK " & linkURL & """}}" & "{\fldrslt{" & linkDescription & "\ul0\cf0}}}>}"
rtfbox.SelectedRtf = rtflink

我排查出来的规律

  • 不管隐藏超链接的显示文本是无效的URL(比如http://www.rest.de)还是纯普通文本(比如“Click here”),都会触发这个问题;
  • 只有当显示文本本身是有效且格式正确的URL时,才不会出问题——而且不管rtfbox.DetectUrls设为true还是false都是这个情况。
  • 我还整理了一段能直接重现问题的RTF源码,大家可以复制到文本编辑器里存成.rtf文件,用RichTextBox打开就能看到问题:
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1031{\fonttbl{\f0\fnil\fcharset0 Rockwell Extra Bold;}{\f1\fnil Consolas;}} {\colortbl ;\red0\green0\blue255;\red0\green0\blue0;} {\*\generator Riched20 10.0.19041}{\*\mmathPr\mdispDef1\mwrapIndent1440 }\viewkind4\uc1  \pard {\cf1\f0\fs24{\field{\*\fldinst{HYPERLINK "https://www.example.com"}}{\fldrslt{\ul\cf1 Click here}}}}\cf1\f0\fs24  \cf2\f1\par \f0 aaa bbb\cf1\par {{\field{\*\fldinst{HYPERLINK "https://www.example.com"}}{\fldrslt{\ul\cf1 Click here}}}}\cf2\f1\fs24\par \f0 aaa bbb\cf1\par {{\field{\*\fldinst{HYPERLINK "https://www.example.com"}}{\fldrslt{\ul\cf1 Click here}}}}\cf2\f1\fs24\par \f0 aaa bbb\cf1\par {{\field{\*\fldinst{HYPERLINK "https://www.example.com"}}{\fldrslt{\ul\cf1 Click here}}}}\cf2\f1\fs24\par \f0 aaa bbb\cf1\par {{\field{\*\fldinst{HYPERLINK "https://www.example.com"}}{\fldrslt{\ul\cf1 Click here}}}}\cf2\f1\fs24\par \f0 aaa bbb\par \cf1\par \par }

打开这个RTF后,RichTextBox里只有前2个链接能触发LinkClicked,后面的3个完全没反应;而且把光标移到第一个链接的显示文本上时,SelectionStart会直接跳到36这种完全不符合预期的数值。

我的推测

我感觉这应该是.NET Framework的RichTextBox对应的RTF解析器有bug——它好像错误地去检测**超链接的显示文本(也就是fldrslt部分)**是否为有效URL,而不是正确地解析超链接字段本身的URL(fldinst里的HYPERLINK内容),导致后续的文本位置计算彻底混乱,进而影响了后面链接的事件触发。

有没有大佬能帮我解决这个问题,让隐藏超链接能在RichTextBox里正常工作呀?

备注:内容来源于stack exchange,提问作者Dideldum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 14:29:33