public override void OnValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if (sender is RichTextBox rcontrol) { Task.Delay(200).ContinueWith((_, obj) => { var control = (RichTextBox)obj; if (control.DataContext is MessageObject msg) { var text = msg.content; string regstr = "(1[3456789]([0-9]){9})|((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"; var rg = new Regex(regstr); var match = rg.Match(text); if (match.Success) { var start = match.Index; var end = match.Index + match.Length; if (control.Document.Blocks.Count == 1) { var block = control.Document.Blocks.FirstBlock; if (block is Paragraph para) { if (para.Inlines.Count == 1) { para.Inlines.Remove(para.Inlines.FirstInline);//先移除老的文本 if (start > 0) { var before = text.Substring(0, start);//添加链接之前的文本 para.Inlines.Add(before); } var link = new Hyperlink(new Run(match.Value));//链接文字 link.Style = App.Current.GetResource<Style>("NoUnderLineLink"); var matchstr = match.Value; //if (matchstr.StartsWith("http") || matchstr.StartsWith("https") || matchstr.StartsWith("ftp") || matchstr.StartsWith("www")) //{ // link.NavigateUri = new Uri(match.Value); //} //else { link.Click += (s, e) => { Process.Start(match.Value); }; } //link.IsEnabledChanged += (s, e) => //{ // var control = (Hyperlink)s; // control.IsEnabled = true; //}; para.Inlines.Add(link); link.Cursor = Cursors.Hand; link.IsEnabled = true; if (end < text.Length - 1)//如果链接在文字中间 { var after = text.Substring(end, text.Length - end); para.Inlines.Add(after); } } } } } } }, rcontrol, TaskScheduler.FromCurrentSynchronizationContext()); } }