winforms 富文本框中的链接?

lxkprmvk  于 2023-06-06  发布在  其他
关注(0)|答案(6)|浏览(139)

我知道richtextboxes可以检测链接(如http://www.yahoo.com),但有没有一种方法可以让我添加链接到它,看起来像文本,但它的链接?比如在哪里可以选择链接的标签?例如,它不是显示为http://www.yahoo.com,而是显示为Click here to go to yahoo
编辑:忘记了,im使用windows窗体
编辑:有没有更好的东西可以用(比如更容易格式化)?

pgx2nnw8

pgx2nnw81#

当然,通过调用一些WIN32功能到您的控件中是可能的,但如果您正在寻找一些标准方法,请查看这篇文章:Create hyperlink in TextBox control
有一些关于不同的整合方式的讨论。
问候语
更新1:最好的方法是遵循这个方法:http://msdn.microsoft.com/en-us/library/f591a55w.aspx
因为RichText框控件为“DetectUrls”提供了一些功能。然后你可以很容易地处理点击的链接:

this.richTextBox1.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBox1_LinkClicked);

你可以通过扩展基类来简单地创建你自己的RichTextBox控件-在那里你可以覆盖你需要的方法,例如DetectUrls。

x4shl7ld

x4shl7ld2#

这里你可以找到一个通过linkLabel在rich Textbox中添加链接的例子:

LinkLabel link = new LinkLabel();
    link.Text = "something";
    link.LinkClicked += new LinkLabelLinkClickedEventHandler(this.link_LinkClicked);
    LinkLabel.Link data = new LinkLabel.Link();
    data.LinkData = @"C:\";
    link.Links.Add(data);
    link.AutoSize = true;
    link.Location =
        this.richTextBox1.GetPositionFromCharIndex(this.richTextBox1.TextLength);
    this.richTextBox1.Controls.Add(link);
    this.richTextBox1.AppendText(link.Text + "   ");
    this.richTextBox1.SelectionStart = this.richTextBox1.TextLength;

下面是处理程序:

private void link_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        System.Diagnostics.Process.Start(e.Link.LinkData.ToString());
    }
4szc88ey

4szc88ey3#

我发现了一种可能不是最优雅的方法,但它只是几行代码并完成了这项工作。也就是说,该想法是通过字体变化来模拟超链接外观,并且通过检测鼠标指针在什么位置上来模拟超链接行为。
代码:

public partial class Form1 : Form
{
    private Cursor defaultRichTextBoxCursor = Cursors.Default;
    private const string HOT_TEXT = "click here";
    private bool mouseOnHotText = false;

    // ... Lines skipped (constructor, etc.)

    private void Form1_Load(object sender, EventArgs e)
    {
        // save the right cursor for later
        this.defaultRichTextBoxCursor = richTextBox1.Cursor;

        // Output some sample text, some of which contains
        // the trigger string (HOT_TEXT)
        richTextBox1.SelectionFont = new Font("Calibri", 11, FontStyle.Underline);
        richTextBox1.SelectionColor = Color.Blue;
        // output "click here" with blue underlined font
        richTextBox1.SelectedText = HOT_TEXT + "\n";

        richTextBox1.SelectionFont = new Font("Calibri", 11, FontStyle.Regular);
        richTextBox1.SelectionColor = Color.Black;
        richTextBox1.SelectedText = "Some regular text";
    }

    private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
    {
        int mousePointerCharIndex = richTextBox1.GetCharIndexFromPosition(e.Location);
        int mousePointerLine = richTextBox1.GetLineFromCharIndex(mousePointerCharIndex);
        int firstCharIndexInMousePointerLine = richTextBox1.GetFirstCharIndexFromLine(mousePointerLine);
        int firstCharIndexInNextLine = richTextBox1.GetFirstCharIndexFromLine(mousePointerLine + 1);
        if (firstCharIndexInNextLine < 0)
        {
            firstCharIndexInNextLine = richTextBox1.Text.Length;
        }

        // See where the hyperlink starts, as long as it's on the same line
        // over which the mouse is
        int hotTextStartIndex = richTextBox1.Find(
            HOT_TEXT, firstCharIndexInMousePointerLine, firstCharIndexInNextLine, RichTextBoxFinds.NoHighlight);

        if (hotTextStartIndex >= 0 && 
            mousePointerCharIndex >= hotTextStartIndex && mousePointerCharIndex < hotTextStartIndex + HOT_TEXT.Length)
        {
            // Simulate hyperlink behavior
            richTextBox1.Cursor = Cursors.Hand;
            mouseOnHotText = true;
        }
        else
        {
            richTextBox1.Cursor = defaultRichTextBoxCursor;
            mouseOnHotText = false;
        }
        toolStripStatusLabel1.Text = mousePointerCharIndex.ToString();
    }

    private void richTextBox1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left && mouseOnHotText)
        {
            // Insert your own URL here, to navigate to when "hot text" is clicked
            Process.Start("http://www.google.com");
        }
    }
}

为了改进代码,可以创建一种优雅的方式来将多个“热文本”字符串Map到它们自己的链接URL(可能是Dictionary<K, V>)。另一个改进是将RichTextBox子类化,以封装上面代码中的功能。

jchrr9hc

jchrr9hc4#

许多月后,.NET(Core)* 的解决方案,至少是.NET 6.0(可能更早)-对于 .NET Framework(其最新版本是4.8),您仍然需要其他解决方案之一:

.Rtf属性现在可以识别RTF格式的超链接;例如,以下呈现为:

这是一个真正的RTF超链接:Example Link

this.richTextBox1.Rtf = @"{\rtf1 This is a true RTF hyperlink:\line {\field{\*\fldinst HYPERLINK ""https://example.org""}{\fldrslt Example Link}}} }";
dojqjjoe

dojqjjoe5#

标准的RichTextBox控件(假设你使用的是Windows窗体)公开了一组相当有限的功能,所以不幸的是,你需要做一些Win32互操作来实现这一点(沿着SendMessage(),CFM_LINK,EM_SETCHARFORMAT等线路)。
您可以在SO上找到有关如何在this answer中执行此操作的更多信息。

llmtgqce

llmtgqce6#

多年前的richtextbox从来不需要超链接。把这个一起去掉。我在与外部设备目标进行异步串行通信的Windows窗体应用程序中使用is作为智能终端仿真器。
移除ilink,因为此处不需要。

相关问题