Richtextboxesがリンク( http://www.yahoo.com など)を検出できることは知っていますが、テキストのように見えるリンクをリンクに追加する方法はありますか?リンクのラベルをどこで選択できるのか?たとえば、 http://www.yahoo.com と表示される代わりに ここをクリックしてyahooに移動します と表示されます
編集:Windowsフォームを使用して、忘れてしまった
編集:(フォーマットするのが簡単なように)使用する方が良いものはありますか?
もちろん、コントロールにいくつかのWIN32機能を呼び出すことで可能ですが、標準的な方法を探している場合は、この投稿を確認してください。 TextBoxコントロールにハイパーリンクを作成
統合のさまざまな方法についていくつかの議論があります。
ご挨拶
更新1:最善の方法は、この方法に従うことです http://msdn.Microsoft.com/en-us/library/f591a55w.aspx
リッチテキストボックスコントロールは、「DetectUrls」にいくつかの機能を提供するためです。次に、クリックしたリンクを非常に簡単に処理できます。
this.richTextBox1.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBox1_LinkClicked);
基本クラスを拡張することで、独自のRichTextBox制御を簡単に作成できます。そこで、DetectUrlsなどの必要なメソッドをオーバーライドできます。
ここでは、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;
そしてここにハンドラがあります:
private void link_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start(e.Link.LinkData.ToString());
}
私は最もエレガントではない方法を見つけましたが、それはほんの数行のコードであり、仕事をします。つまり、フォントの変更によってハイパーリンクの外観をシミュレートし、マウスポインターが何を指しているかを検出することによってハイパーリンクの動作をシミュレートするという考え方です。
コード:
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");
}
}
}
コードを改善するために、複数の「ホットテキスト」文字列を独自のリンクされたURL(a Dictionary<K, V>
多分)。追加の改善は、上記のコードにある機能をカプセル化するためにRichTextBox
をサブクラス化することです。
標準のRichTextBoxコントロール(Windowsフォームを使用している場合)は、機能の制限されたセットを公開しているため、残念ながら、Win32相互運用を実行する必要があります(SendMessage()、CFM_LINK、EM_SETCHARFORMATなどの行に沿って)。
これを行う方法の詳細については、SOの this answer を参照してください。