2012-03-24 7 views
17

Ich weiß, dass Richtextboxen Links erkennen können (wie http://www.yahoo.com), aber gibt es eine Möglichkeit für mich, Links hinzuzufügen, die wie Text aussehen, aber ein Link? Wie können Sie das Label des Links auswählen? Zum Beispiel davon, statt wie http://www.yahoo.com erscheinen scheint es, als Click here to go to yahooLinks in Rich Textbox?

edit: forgot, im mit Windows Forms

bearbeitet: Gibt es etwas, das besser zu nutzen (wie in einfachem Format)?

+0

Es ist automatisch. Fange einfach an "www." oder "http: //" und Shazam! Es ist ein Link. Funktioniert auch in Code. Verwenden Sie das LinkClicked-Ereignis, um Klicks auf sie zu erkennen. –

+0

lesen Sie die Frage, "statt als http: // ... erscheint es als Klicken Sie hier ..." – Oztaco

+0

Nun, es war ein Shazam! Kommentar. EM_SETPAFAFORMAT sieht unglücklich aus. –

Antwort

5

Natürlich ist es möglich, durch eine WIN32-Funktionalität in Ihrer Kontrolle aufrufen, aber wenn Sie für einige Standard Möglichkeiten suchen, überprüfen Sie diese Pfosten heraus: Create hyperlink in TextBox control

einige Diskussionen über verschiedene Möglichkeiten der Integration Es gibt keine.

Grüße

Update 1: Das Beste ist, diese Methode zu folgen: http://msdn.microsoft.com/en-us/library/f591a55w.aspx

weil die RichText- Box steuert einige Funktionen auf "DetectUrls" zur Verfügung stellt. Dann können Sie die Links geklickt Griff sehr einfach:

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

und Sie können Ihre eigene RichTextBox contorl einfach erstellen, indem Sie die Basisklasse erstreckt - dort können Sie die Methoden außer Kraft setzen Sie benötigen, beispielsweise die DetectUrls.

0

Das Standard-RichTextBox-Steuerelement (unter der Annahme, dass Sie Windows Forms verwenden) stellt eine ziemlich begrenzte Reihe von Features zur Verfügung, so müssen Sie leider einige Win32-Interop zu tun (in den Zeilen von SendMessage(), CFM_LINK, EM_SETCHARFORMAT usw.) .).

Weitere Informationen dazu finden Sie in this answer hier auf SO.

6

Hier sehen Sie ein Beispiel für das Hinzufügen eines Links in Rich Textbox von link finden:

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; 

Und hier ist der Handler:

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

ich einen Weg gefunden, das nicht die meisten sein kann elegant, aber es ist nur ein paar Zeilen Code und macht den Job. Die Idee besteht nämlich darin, die Darstellung von Hyperlinks mittels Schriftartänderungen zu simulieren und das Verhalten von Hyperlinks zu simulieren, indem erkannt wird, auf was sich der Mauszeiger bezieht.

Der Code:

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

auf dem Code zu verbessern, könnte man eine elegante Art und Weise abzubilden mehr "hot Text" Strings, um ihre eigene verknüpften URLs (a Dictionary<K, V> vielleicht) erstellen. Eine weitere Verbesserung wäre die Unterklasse RichTextBox, um die Funktionalität des obigen Codes zu kapseln.

Verwandte Themen