VS2022中.NET Framework 4.7的RichTextBox隐藏超链接引发SelectionStart异常及后续链接失效问题
VS2022中.NET Framework 4.7的RichTextBox隐藏超链接引发SelectionStart异常及后续链接失效问题
大家好,我是重新捡起来VB.NET的开发者——之前有VB6基础,但中间十几年没碰代码,现在用VS2022做基于.NET Framework 4.7的项目,遇到了RichTextBox的棘手问题,找了各种地方都没找到解决方案,想请教下大家。
问题场景与现象
- 一开始我做了个测试RTF文档,里面有4个普通超链接,在RichTextBox里点击每个链接都能正常触发
LinkClicked事件,完全没问题。 - 但当我在第2和第3个链接之间插入隐藏超链接(也就是链接的实际URL和显示文本不一样,比如URL是
https://welt.de,显示成“Click here”)之后,怪事就发生了:- 这个隐藏超链接本身显示正常,但只要把光标移到它的显示文本上,
rtfbox.SelectionStart就会出现完全不符合预期的数值; - 原来的第4个链接(现在变成第5个)再也触发不了
LinkClicked事件了,点了完全没反应。
- 这个隐藏超链接本身显示正常,但只要把光标移到它的显示文本上,
- 我还用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
相关产品推荐
相关产品推荐

