winforms RichTextBox中RTF文件中断开的超链接

mnemlml8  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(187)

我正在使用RichTextBox显示RTF文件,其中包含一个超链接。链接文本不是URL(目标 * 是 * 有效的URL)。RTF是用Word创建的。Word和写字板都能正确识别链接(写字板不启动链接,但显示相应的手形光标)。
当我将RTF加载到RichTextBox中时,链接的格式显示正确(蓝色并带下划线),但它的行为与链接不同,当光标移到链接上时,它仍保持I形,LinkClicked事件将不会触发,并且它实际上在链接后的尖括号中显示目标(这似乎不正确)。由于链接文本不是URL,DetectUrls在这里没有帮助。
RichTextBox没有正确处理这些链接是否有原因,或者是否有方法使它们按预期工作?
下面是代码。

TipView.Rtf = tips[tipIndex];
// I've also tried TipView.LoadFile, with identical result

要重现此问题,请使用Word(我使用的是2000)创建一个RTF文档,其中包含一个链接,该链接的文本不是URL,但指向一个有效的URL,然后以编程方式将.rtf文件加载到RichTextBox中(我在C# Express 2008中使用的是.NET 2.0)。

vecaoik1

vecaoik11#

要支持超链接,需要RICHEDIT50W version of "rich edit"
为此:

  • 或者使用.NET Framework 4.7,它在RichTextBox中本机使用RICHEDIT50W
  • 在旧版的.NET Framework中,您可以修改RichTextBox以使用RICHEDIT50W
public class ExRichText : RichTextBox
  {
      [DllImport("kernel32.dll", EntryPoint = "LoadLibraryW",
                 CharSet = CharSet.Unicode, SetLastError = true)]
      private static extern IntPtr LoadLibraryW(string s_File);

      protected override CreateParams CreateParams
      {
          get
          {
              var cp = base.CreateParams;
              LoadLibraryW("MsftEdit.dll");
              cp.ClassName = "RichEdit50W";
              return cp;
          }
      }
  }
  • 基于RichTextBox选择突出显示,RichTextBox无法显示Unicode数学字母数字符号 *。

升级到RICHEDIT50W后,可能需要进行其他修复:
Some hyperlinks don't trigger the LinkClicked event when loading a file into RichTextBox

相关问题