Visual Basic中RichTextBox添加多组可点击文本链接失败问题
RichTextBox嵌入多组可点击自定义链接问题
在VB WinForm开发中,要在RichTextBox里嵌入多组非URL格式的可点击高亮文本,单组链接能正常显示且点击后控制台输出对应文本,但添加第二组链接后,第二个链接完全看不到。
单链接正常运行代码
Public Class Form1 Dim linktarget As String = "" Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim lnk1 As New LinkLabel CreateLink(lnk1, "This is the Target", "Description of Link") txtBox.Controls.Add(lnk1) End Sub Public Sub CreateLink(lnk As LinkLabel, linkTarget As String, linkText As String) lnk.LinkColor = Color.Blue Dim lk As LinkLabel.Link = lnk.Links.Add(0, linkText.Length, linkTarget) lnk.Text = linkText AddHandler lnk.LinkClicked, AddressOf LinkClicked End Sub Private Sub LinkClicked(ByVal sender As Object, ByVal e As EventArgs) 'send link to the browser Console.WriteLine(sender.Text) End Sub End Class
添加第二个链接后无显示的代码
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim lnk1 As New LinkLabel CreateLink(lnk1, "This is the Target", "Description of Link") txtBox.Controls.Add(lnk1) Dim lnk2 As New LinkLabel CreateLink(lnk2, "Another Target", "Description of 2nd Link") txtBox.Controls.Add(lnk2) End Sub
问题原因
直接将LinkLabel控件添加到RichTextBox的Controls集合时,新创建的LinkLabel默认和第一个控件的Location属性一致(均为(0,0)),导致第二个LinkLabel被第一个完全遮挡,所以无法看到。
解决办法
方案1:调整LinkLabel位置避免重叠
手动设置每个LinkLabel的位置,让它们依次排列:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim lnk1 As New LinkLabel CreateLink(lnk1, "This is the Target", "Description of Link") txtBox.Controls.Add(lnk1) Dim lnk2 As New LinkLabel CreateLink(lnk2, "Another Target", "Description of 2nd Link") ' 将第二个链接放在第一个链接的下方,避免重叠 lnk2.Location = New Point(lnk1.Location.X, lnk1.Location.Y + lnk1.Height + 8) txtBox.Controls.Add(lnk2) End Sub
方案2:直接在RichTextBox文本中创建自定义链接(更符合嵌入需求)
如果需要把链接和普通文本混排,建议使用RichTextBox自身的链接功能,无需额外添加LinkLabel控件:
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 先添加包含链接文本的内容 txtBox.Text = "这里是第一组链接:Description of Link,这里是第二组链接:Description of 2nd Link" ' 创建第一个自定义链接 txtBox.Select(txtBox.Text.IndexOf("Description of Link"), "Description of Link".Length) txtBox.Links.Add(txtBox.SelectionStart, txtBox.SelectionLength, "This is the Target") ' 创建第二个自定义链接 txtBox.Select(txtBox.Text.IndexOf("Description of 2nd Link"), "Description of 2nd Link".Length) txtBox.Links.Add(txtBox.SelectionStart, txtBox.SelectionLength, "Another Target") ' 设置链接显示样式 txtBox.LinkColor = Color.Blue txtBox.ActiveLinkColor = Color.Red AddHandler txtBox.LinkClicked, AddressOf RichTextBoxLinkClicked End Sub Private Sub RichTextBoxLinkClicked(sender As Object, e As LinkClickedEventArgs) ' 输出链接对应的目标内容 Console.WriteLine(e.LinkData.ToString()) End Sub End Class
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

