I collegamenti all’interno rich textbox?

So che richtextboxes grado di rilevare i link (come http://www.yahoo.com), ma c’è un modo per me di aggiungere dei collegamenti che assomiglia a un testo, ma un link? Come dove è possibile scegliere l’etichetta del link? Per esempio, invece di apparire come http://www.yahoo.com appare come Clicca qui per andare su yahoo

edit: dimenticavo, im utilizzando windows form

edit: c’è qualcosa che è per l’uso (come in semplice formato)?

  • È automatico. Basta iniziare a digitare “www.” o “http://” e Shazam! si tratta di un link. Opere in codice. Utilizzare il LinkClicked evento per rilevare clic su di essi.
  • leggere la domanda, “invece di appearin http://… sembra come Clicca qui…”
  • Beh, era un Shazam! commento. EM_SETPARAFORMAT sembra infelice.
  • Soluzione: codeproject.com/Articles/9196/…
InformationsquelleAutor Oztaco | 2012-03-24



4 Replies
  1. 9

    E ‘ ovviamente possibile, richiamando alcuni WIN32 funzionalità nel vostro controllo, ma se siete alla ricerca di alcuni modi standard, controllare questo post:
    Creare un collegamento ipertestuale in un controllo TextBox

    Ci sono alcune discussioni sui 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é il RichText controlli casella fornisce alcune funzionalità di “DetectUrls”. Quindi è possibile gestire i link cliccati molto semplice:

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

    e si può facilmente creare il proprio RichTextBox control, estendendo la classe base non è possibile eseguire l’override dei metodi di cui avete bisogno, per esempio il DetectUrls.

  2. 8

    Qui potete trovare un esempio di aggiunta di un link nella casella di testo rtf da 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());
        }
    • Questo non funziona correttamente con scorrevoli per una richTextBox. Il link si libra sopra il sistema di controllo…
    • Molte grazie per il codice di esempio, sono riuscito a farlo funzionare anche con lo scorrimento. Ho messo link.Tag = link.Location; per il backup la posizione del link, e quindi sostituire la sua posizione Point p = (Point)l.Tag; e l.Top = richTextBox1.GetPositionFromCharIndex(0).Y + p.Y; su richTextBox1_VScroll e richTextBox1_HScroll.
  3. 1

    Ho trovato un modo che potrebbe non essere il più elegante, ma si tratta di poche righe di codice e non il lavoro. Cioè, l’idea di simulare l’aspetto del collegamento ipertestuale per mezzo di modifiche di carattere, e di simulare il comportamento del collegamento ipertestuale, rilevando che il puntatore del mouse si trova su.

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

    Per migliorare il codice, si potrebbe creare un modo elegante per una mappa più “caldo” per il testo di stringhe di loro collegati Url (un Dictionary<K, V> forse). Un ulteriore miglioramento sarebbe quello di creare una sottoclasse RichTextBox per incapsulare le funzionalità che il codice di cui sopra.

  4. 0

    Standard di controllo RichTextBox (supponendo che si sta utilizzando Windows Form) espone piuttosto di un insieme limitato di funzionalità e, quindi, non è necessario fare alcune Win32 interoperabilità per ottenere che (lungo le linee di SendMessage(), CFM_LINK, EM_SETCHARFORMAT etc.).

    È possibile trovare ulteriori informazioni su come farlo in questa risposta qui su so.

Lascia un commento