RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 660326
Accepted
Monk
Monk
Asked:2020-04-30 23:11:45 +0000 UTC2020-04-30 23:11:45 +0000 UTC 2020-04-30 23:11:45 +0000 UTC

使文本中的链接可点击

  • 772

我用ListView它来显示日志。有时日志中有链接(例如,“无效链接:http ://example.com/ ”),我只想点击它们,它们会在普通浏览器中打开。

这可以自动完成,还是必须手动解析并转换为 和 的Run组合Hyperlink?

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. vlasovsv
    2020-04-30T23:41:37Z2020-04-30T23:41:37Z

    如果链接可以出现在日志中的任何位置,那么您可以编写一个正则表达式来提取所需的一个或多个链接。根据收到的信息形成一个表示模型。然后为将使用 HyperLink 的 ListView 元素编写一个模板。

    • 0
  2. Best Answer
    Monk
    2020-05-01T14:48:20Z2020-05-01T14:48:20Z

    使用此处的实现和此处的正则表达式(但是,我在模板中添加了逗号作为分隔符,不幸的是,它发生在日志中),我们得到了这样的实现。

      public class TextBlockWithHyperlinks : TextBlock
      {
        private static readonly Regex HyperlinkRegex = new Regex(@"(https?|ftp):\/\/[^\s/$.?#].[^\s,]*");
    
        static TextBlockWithHyperlinks()
        {
          DefaultStyleKeyProperty.OverrideMetadata(typeof(TextBlockWithHyperlinks), new FrameworkPropertyMetadata(typeof(TextBlockWithHyperlinks)));
        }
    
        public TextBlockWithHyperlinks()
        {
          TargetUpdated += (s, args) => Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(ParseHyperlinks));
        }
    
        private void ParseHyperlinks()
        {
          var style = HyperlinkStyle;
          var text = Text;
          var matches = HyperlinkRegex.Matches(text);
          if (matches.Count == 0)
            return;
    
          Inlines.Clear();
          var lastIndex = 0;
          foreach (Match match in matches)
          {
            Inlines.Add(text.Substring(lastIndex, match.Index - lastIndex));
            lastIndex = match.Index + match.Length;
            var run = new Run(match.Value) { Style = style };
            run.MouseDown += RunOnMouseDown;
            Inlines.Add(run);
          }
          Inlines.Add(text.Substring(lastIndex));
        }
    
        private void RunOnMouseDown(object sender, MouseButtonEventArgs args)
        {
          var run = sender as Run;
          if (run == null)
            return;
    
          OnHyperlinkPressed(new HyperlinkPressedEventArgs(run.Text));
        }
    
        public event EventHandler<HyperlinkPressedEventArgs> HyperlinkPressed;
    
        public void OnHyperlinkPressed(HyperlinkPressedEventArgs args)
        {
          var handler = HyperlinkPressed;
          handler?.Invoke(this, args);
        }
    
        public static readonly DependencyProperty HyperlinkStyleProperty = DependencyProperty.Register("HyperlinkStyle",
                                                                                                  typeof(Style),
                                                                                                  typeof(TextBlockWithHyperlinks));
    
        public Style HyperlinkStyle
        {
          get { return (Style)GetValue(HyperlinkStyleProperty); }
          set { SetValue(HyperlinkStyleProperty, value); }
        }
      }
    
      public class HyperlinkPressedEventArgs : EventArgs
      {
        public readonly Uri Hyperlink;
    
        public HyperlinkPressedEventArgs(Uri hyperlink)
        {
          Hyperlink = hyperlink;
        }
    
        public HyperlinkPressedEventArgs(string hyperlink) : this(new Uri(hyperlink))
        {
        }
      }
    

    它很容易插入到标记中,只有一个但是 - 你总是需要包含NotifyOnTargetUpdated.

              <local:TextBlockWithHyperlinks HyperlinkPressed="TextBlockWithLinks_OnHyperlinkPressed" 
                                        HyperlinkStyle="{StaticResource HyperlinkStyle}"
                                        Text="{Binding FormattedMessage, NotifyOnTargetUpdated=True}"/>
    

    样式简单,下划线和蓝色:

    <Style x:Key="HyperlinkStyle" TargetType="{x:Type Run}" >
      <Style.Setters>
        <Setter Property="Foreground" Value="Blue"/>
      </Style.Setters>
      <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
          <Setter Property="TextDecorations" Value="Underline"/>
          <Setter Property="Cursor" Value="Hand"/>
        </Trigger>
      </Style.Triggers>
    </Style>
    

    理论上,链接处理程序应该在防止危险操作的情况下完成,但现在是这样的:

    private void TextBlockWithLinks_OnHyperlinkPressed(object sender, HyperlinkPressedEventArgs args)
    {
      System.Diagnostics.Process.Start(args.Hyperlink.OriginalString);
    }
    
    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5