RichTextBoxのRTFファイルで壊れたハイパーリンク
-
22-07-2019 - |
質問
RichTextBox
を使用して、単一のハイパーリンクを含むRTFファイルを表示しています。リンクテキストはURLではありません(ターゲットは有効なURLです )。 RTFはWordで作成されました。 Wordとワードパッドの両方がリンクを適切に認識します(ワードパッドはリンクを起動しませんが、適切なハンドカーソルを表示します)。
RTFを RichTextBox
にロードすると、リンクは正しくフォーマットされているように見えます(青と下線付き)が、リンクのように動作するのではなく、カーソルがリンク上を移動してもIビームのままです、 LinkClicked
イベントは発生せず、リンクの後に山括弧で囲まれたターゲットを実際に表示します(これは正しくないと思われます)。リンクテキストはURLではないため、 DetectUrls
はここでは役に立ちません。
RichTextBox
がこれらのリンクを適切に処理しない理由、または期待どおりにリンクを機能させる方法はありますか?
コードは次のとおりです。
TipView.Rtf = tips[tipIndex];
// I've also tried TipView.LoadFile, with identical result
問題を再現するには、テキストはURLではなく有効なURLをターゲットとする1つのリンクを含むWord(2000を使用しています)でRTFドキュメントを作成し、.rtfファイルを RichTextBox
(C#Express 2008で.NET 2.0を使用しています)。
解決
ハイパーリンクをサポートするには、 <が必要です。 code> RICHEDIT50W &quot; rich edit&quot; のバージョン。
そのために:
- いずれも.NET Framework 4.7を使用します。これは
RichTextBox
でRICHEDIT50W
をネイティブに使用します。 -
.NET Frameworkの古いバージョンでは、
RICHEDIT50W
を使用するようにRichTextBox
を変更できます:public class ExRichText : RichTextBox { [DllImport("kernel32.dll", EntryPoint = "LoadLibraryW", CharSet = CharSet.Unicode, SetLastError = true)] private static extern IntPtr LoadLibraryW(string s_File); protected override CreateParams CreateParams { get { var cp = base.CreateParams; LoadLibraryW("MsftEdit.dll"); cp.ClassName = "RichEdit50W"; return cp; } } }