• 标记RichTextBox中符合正则的文字为链接


    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());
                }
            }
  • 相关阅读:
    Eclipse CDT Linux下内存分析 实战历险
    .Net元编程【Metaprogramming in NET】 序-翻译
    go语言和资料
    代码提交 【转】
    两本有意思的书【代码的未来、淘宝技术这十年】
    C/C++构建系统 GNU autotool
    C/C++构建系统 -工具汇总
    使用Java语言开发微信公众平台(四)——图文消息的发送与响应
    Onsen UI 前端框架(二)
    Maven项目搭建(一):Maven初体验
  • 原文地址:https://www.cnblogs.com/MichaelJson/p/16309552.html
Copyright © 2020-2023  润新知