2012-03-24 1 views
17

So che i richtextboxes possono rilevare collegamenti (come http://www.yahoo.com) ma c'è un modo per me di aggiungere collegamenti ad esso che sembrano testo ma è un collegamento? Ti piace dove puoi scegliere l'etichetta del link? Per esempio, invece di apparire come si http://www.yahoo.com appare come Click here to go to yahooCollegamenti all'interno di una casella di testo estesa?

edit: dimenticavo, im utilizzando Windows Form

edit: c'è qualcosa di questo è meglio usare (come nel più semplice formato)?

+0

È automatico. Inizia a digitare "www." o "http: //" e Shazam! è un collegamento. Funziona anche nel codice. Utilizzare l'evento LinkClicked per rilevare i clic su di essi. –

+0

leggi la domanda, "invece di apparire come http: // ... appare come Clicca qui ..." – Oztaco

+0

Beh, era uno Shazam! commento. EM_SETPARAFORMAT sembra infelice. –

risposta

5

Naturalmente è possibile invocando alcune funzionalità Win32 nel vostro controllo, ma se siete alla ricerca di alcuni modi standard, controllare questo post out: Create hyperlink in TextBox control

Ci sono alcune discussioni su diversi modi di integrazione.

saluti

Aggiornamento 1: La cosa migliore è quello di seguire questo metodo: http://msdn.microsoft.com/en-us/library/f591a55w.aspx

perché i controlli della casella RTF fornisce alcune funzionalità a "DetectUrls". Quindi è possibile gestire i link cliccati molto semplice:

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

e semplice è possibile creare il proprio contorl RichTextBox estendendo la classe di base - non è possibile ignorare i metodi necessari, ad esempio, i DetectUrls.

0

Il controllo RichTextBox standard (supponendo che si sta utilizzando Windows Form) espone un insieme piuttosto limitato di funzioni, così purtroppo sarà necessario fare un po 'Win32 interoperabilità per conseguire tale (sulla falsariga di SendMessage(), CFM_LINK, EM_SETCHARFORMAT ecc .).

È possibile trovare ulteriori informazioni su come farlo in this answer qui su SO.

6

Qui potete trovare un esempio di aggiunta di un link nella casella di testo RTF per 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; 

E qui è il gestore:

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

ho trovato un modo che non può essere il più elegante, ma sono solo poche righe di codice e fa il lavoro. Vale a dire, l'idea è di simulare l'aspetto del collegamento ipertestuale mediante modifiche ai caratteri e simulare il comportamento del collegamento ipertestuale rilevando il puntatore del mouse.

Il codice:

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

di migliorare il codice, si potrebbe creare un modo elegante per mappare più "caldi" di testo corde ai propri URL collegato (un Dictionary<K, V> forse). Un ulteriore miglioramento sarebbe quello di sottoclasse RichTextBox per incapsulare la funzionalità che si trova nel codice sopra.