Ссылки внутри богатого текстового поля?
Я знаю, что richtextboxes может обнаруживать ссылки (например, http://www.yahoo.com), но есть ли способ добавить к нему ссылки, которые выглядят как текст, но его ссылка? Как там, где вы можете выбрать ярлык ссылки? Например, вместо него, как http://www.yahoo.com, он выглядит как Нажмите здесь, чтобы перейти к Yahoo
изменить: забыли, im используя формы Windows
edit: есть ли что-то, что лучше использовать (как в упрощенном форматировании)?
Ответы
Ответ 1
Конечно, это возможно, вызвав некоторые функции 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 contorl, расширив базовый класс - там вы можете переопределить методы, которые вам нужны, например DetectUrls.
Ответ 2
Здесь вы можете найти пример добавления ссылки в расширенном текстовом поле по ссылкеLabel:
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());
}
Ответ 3
Стандартный элемент управления RichTextBox (при условии, что вы используете Windows Forms) предоставляет довольно ограниченный набор функций, поэтому, к сожалению, для этого вам понадобится сделать несколько взаимодействий Win32 (в строках SendMessage(), CFM_LINK, EM_SETCHARFORMAT и т.д.).
Более подробную информацию о том, как это сделать в этом ответе, можно найти здесь на SO.
Ответ 4
Я нашел способ, который может быть не самым элегантным, но это всего лишь несколько строк кода и выполняет эту работу. А именно, идея состоит в том, чтобы имитировать внешний вид гиперссылки с помощью изменений шрифтов и имитировать поведение гиперссылки, обнаружив, что указатель мыши включен.
Код:
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 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
, чтобы инкапсулировать функциональность, указанную в вышеприведенном коде.