2015-02-26 1 views
-1

У меня есть RichTextBox, и я хочу добавить ссылку внутри, с произвольным текстом, например this.RichTextBox: Ссылки с произвольным текстом

Я нашел что-то сделать (http://www.codeproject.com/Articles/9196/Links-with-arbitrary-text-in-a-RichTextBox), но я не могу использовать его, потому что я уже использую RichTextBoxEx от DotNetBar, и я не могу его заменить.

Любые идеи?

Заранее спасибо.

+0

Что вы имеете в виду, что вы не можете его использовать .. Можете ли вы показать, что у вас есть или что вы используете до сих пор .. на основе метода перегружает код, который имеет код в ссылке, вы можете использовать его .. но я только догадываюсь здесь, так как вы не предоставили и фактический пример кода, относящийся к вашей текущей проблеме. – MethodMan

+0

Нет кода для предоставления, я не могу заменить свой RichTextBoxEx, потому что он исходит из DotNetBar и предоставляет множество функций. Если я заменил его на RichTextBoxLinks, который я нашел, я не смогу использовать функции, включенные в предыдущий RichTextBox. – Gamma

+0

смотрите здесь, как это сделать с помощью RichTextBox http://stackoverflow.com/questions/435607/c-sharp-how-can-i-make-a-hyperlink-work-in-a-richtextbox – MethodMan

ответ

0

Если вы можете кодировать MouseMove и MouseClick события, которые вы можете добавить 64 ссылок на почти любой RichTextBox RTB:

Dictionary<int, string> links = new Dictionary<int, string>(); 

private void cb_insertLink_Click(object sender, EventArgs e) 
{ 
    int index = links.Count; 
    RTB.SelectionColor = LinkColor(index); // calculate color from index 
    RTB.SelectionFont = new Font(RTB.SelectionFont, FontStyle.Underline); 
    RTB.SelectedText = tb_text.Text; 
    links.Add(index, tb_link.Text); 
} 

private void RTB_MouseMove(object sender, MouseEventArgs e) 
{ 
    int charPos = RTB.GetCharIndexFromPosition(e.Location); 
    int sst = RTB.SelectionStart; 
    RTB.SelectionStart = charPos; 
    Color cs = RTB.SelectionColor; // grab the color at the mouse pos 
    RTB.SelectionStart = sst; 
    Cursor = OverLink(cs) < 65 ? Cursors.Hand : RTB.Cursor; 
} 

private void RTB_MouseClick(object sender, MouseEventArgs e) 
{ 
    int linkId = OverLink(RTB.SelectionColor); 
    if (linkId < 65 && links.Keys.Contains(linkId)) 
     System.Diagnostics.Process.Start(links[linkId]); 
} 

int OverLink(Color col) 
{ 
    int linkId = 255 - col.B; // the link id is the offset from Blue 
    if (linkId == col.R && col.G == linkId) return linkId; else return 255; 
} 

Color LinkColor(int index) { return Color.FromArgb(255, index, index, 255 - index); } 

Вот как это работает: в cb_insertLink_Click события происходят две вещи: Тексты двух TextBoxes используются для

  • добавить текст в он текущей позиции курсора
  • добавить ссылку на словарь

Текст и ссылка объединены специальным оттенком синего цвета, который используется для цветного текста и в качестве ключа в словаре.

Идентификаторы MouseMove и MouseClick добавлены для отображения указателя руки и запуска процесса, который может открыть ссылку.

Текст ссылки может быть отредактирован свободно и будет работать, пока цвет не будет изменен.

До сих пор не существует метода очистки, чтобы избавиться от осиротевших записей в словаре ссылок.

Я закодировал предел 64 оттенков, чтобы держать вещи в том же цветовом диапазоне ..

Добавление кода для редактирования ссылок не должно быть никаких проблем для вас.

Я не уверен, что это поможет вам с тех пор, как вы используете RichTextBoxEx, но на самом деле он не использует никаких экзотических функций.

+0

Я надеялся на более легкое решение, но, думаю, у меня нет выбора. Большое спасибо! – Gamma

+0

Согласен, не потому, что решение на самом деле сложна, но поскольку она требует дополнительной статистической структуры словаря, которая никоим образом не гарантируется, чтобы оставаться полностью неповрежденной, если пользователи слишком много мучают с текстом: изменение цветов приведет к поломке ссылки, а удаление ссылок приведет к сироту записей словаря. легко решается, но как только вы позволяете пользователям менять цвета, обработка и очистка требуют немного дополнительной мысли .. - Но RTB просто не поддерживает текст бесплатной ссылки и даже когда вы создаете doc im word со свободными текстами, он отображает их все не так.. – TaW