最近都在做一個能在Winform的RichTextBox中添加像網頁中的超鏈接<a></a>的形式,在網上找很多,大部分有兩種方式,一個是把控件的DetectUrls屬性改為true,這樣在控件上直接輸入網址控件直接可以檢測到,再以鏈接形式顯示,這樣做的話與目的相差有點遠。另外一種方法就是使用linklabel,具體使用也不說了,但是這樣做就不能編輯,而已都懸浮在文字上面,看起來不爽。
但是我在codeproject這個論壇上找到一個,重寫了richtextbox控件,可以直接添加文字超鏈接,與網頁上的效果一樣,下載地址:Download source files and demo project - 23 Kb
但是保存了rtf后再顯示出來就有問題了,鏈接不見了。
於是我就再他的基礎上修改了下,就在他的添加方法:

1 public void InsertLink(string text, string hyperlink, int position) 2 { 3 if (position < 0 || position > this.Text.Length) 4 throw new ArgumentOutOfRangeException("position"); 5 6 this.SelectionStart = position; 7 this.SelectedRtf = @"{\rtf1\ansi "+text+@"\v #"+hyperlink+@"\v0}"; 8 this.Select(position, text.Length + hyperlink.Length + 1); 9 this.SetSelectionLink(true); 10 this.Select(position + text.Length + hyperlink.Length + 1, 0); 11 }
里面的:
this.SelectedRtf = @"{\rtf1\ansi "+text+@"\v #"+hyperlink+@"\v0}";
在自己需要添加的超鏈接文字前后添加rtf標簽,比如 <! !>
變成:
this.SelectedRtf = @"{\rtf1\ansi <! "+text+@" !>\v #"+hyperlink+@"\v0}";
這樣的話,把richtextbox的rtf保持起來,再顯示的時候,把這個rtf賦給控件的rtf,會顯示<! text !>
把我添加的標志也顯示出來了,這樣還沒達到效果,仔細觀看他原來的代碼中出現個/v /v0,這對標簽原來是用來隱藏位於中間的字符串的,於是就再之前添加的<! !>,放在/v /v0之間,這樣就可以把自己添加的標簽隱藏起來,這樣就會達到超鏈接的效果了,但是呢,這樣還不行,因為把保存起來的rtf再賦值給控件的rtf,超鏈接還是不見了,我就采用了一個很笨的方法,在重寫控件的里面添加一個方法,就是先把rtf轉換為文本,這樣文本種就會出現<! text#hyperlink !>,我自己就把這段字符串以<!和!>拆開,然后獲取到text和hyperlink然后再調用上面的方法InsertLink。一段一段的添加到控件上,顯示出來的就真的是超鏈接了,最后當然還要調用richTextBoxEx1_LinkClicked這個事件處理點擊后的相關處理啦。
好了。代碼就不上了,自己說的感覺有點亂亂的,第一次發博。如果您好什么好的建議好的想法,歡迎留言!
謝謝