Ссылки внутри текстового поля? - PullRequest
22 голосов
/ 25 марта 2012

Я знаю, что richtextboxes может обнаруживать ссылки (например, http://www.yahoo.com), но есть ли для меня способ добавить ссылки, которые выглядят как текст, но содержат ссылку? Например, где вы можете выбрать метку ссылки? Например, вместо того, чтобы отображаться как http://www.yahoo.com, он выглядит как Нажмите здесь, чтобы перейти к Yahoo

редактировать: забыл, я использую формы Windows

edit: есть что-то, что лучше использовать (как в более простом формате)?

Ответы [ 4 ]

9 голосов
/ 25 марта 2012

Конечно, это возможно, вызывая некоторые функции WIN32 для вашего элемента управления, но если вы ищете какие-то стандартные способы, проверьте этот пост: Создать гиперссылку в элементе управления TextBox

ТамВот некоторые дискуссии о различных способах интеграции.

приветствия

Обновление 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.

8 голосов
/ 06 ноября 2014

Здесь вы можете найти пример добавления ссылки в расширенном текстовом поле с помощью linkLabel:

    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());
    }
1 голос
/ 25 августа 2015

Я нашел способ, который может быть не самым элегантным, но это всего лишь несколько строк кода и делает свою работу.А именно, идея состоит в том, чтобы симулировать появление гиперссылок с помощью изменений шрифтов и моделировать поведение гиперссылок, обнаруживая, на что наведен указатель мыши.

Код:

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");
        }
    }
}

Чтобы улучшитькод, можно создать элегантный способ сопоставления нескольких строк «горячего текста» с их собственными связанными URL-адресами (возможно, Dictionary<K, V>).Дополнительным улучшением было бы создание подкласса RichTextBox для инкапсуляции функциональности, представленной в приведенном выше коде.

0 голосов
/ 25 марта 2012

Стандартный элемент управления RichTextBox (при условии, что вы используете Windows Forms) предоставляет довольно ограниченный набор функций, поэтому, к сожалению, вам потребуется некоторое взаимодействие с Win32 для достижения этого (в соответствии с SendMessage (), CFM_LINK, EM_SETCHARFORMAT и т. Д.).

Более подробную информацию о том, как это сделать, можно найти в этом ответе здесь, на SO.

...