【问题标题】:Add clickable hyperlinks to a RichTextBox without new paragraph将可点击的超链接添加到没有新段落的 RichTextBox
【发布时间】:2012-08-31 11:16:59
【问题描述】:

是否可以像这个问题Dynamically adding hyperlinks to a RichTextBox 那样在不创建新段落的情况下动态添加超链接?

我想要类似“请访问http://www.google.com。谢谢!”不是

"请访问

http://www.google.com

.谢谢!”。

RichTextBox 也必须是只读的,用户不能输入。它有点像日志,我只需要定期添加一些有时包含 URL 的文本。

【问题讨论】:

  • 你是说最后一段里的RichTextBox吗?

标签: c# wpf richtextbox


【解决方案1】:

好的,看起来这就是我需要的(感谢@Blam 和@PaulN Dynamically adding hyperlinks to a RichTextBox):

    public MainWindow()
    {
        InitializeComponent();

        rtb.IsDocumentEnabled = true;
        rtb.Document.Blocks.FirstBlock.Margin = new Thickness(0);
    }

    private void AddHyperlinkText(string linkURL, string linkName, 
              string TextBeforeLink, string TextAfterLink)
    {
        Paragraph para = new Paragraph();
        para.Margin = new Thickness(0); // remove indent between paragraphs

        Hyperlink link = new Hyperlink();
        link.IsEnabled = true;
        link.Inlines.Add(linkName);
        link.NavigateUri = new Uri(linkURL);
        link.RequestNavigate += (sender, args) => Process.Start(args.Uri.ToString()); 

        para.Inlines.Add(new Run("[" + DateTime.Now.ToLongTimeString() + "]: "));
        para.Inlines.Add(TextBeforeLink);
        para.Inlines.Add(link);
        para.Inlines.Add(new Run(TextAfterLink)); 

        rtb.Document.Blocks.Add(para);
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {   
        AddHyperlinkText("http://www.google.com", "http://www.google.com", 
               "Please visit ", ". Thank you! Some veeeeeeeeeery looooooong text.");
    } 

但还有一个小问题:也许有人知道如何删除上图红线标记的开头的空白?

【讨论】:

  • 你能弄清楚如何删除那个空行吗?我有同样的问题:(
  • @BVB,没有。我还尝试以某种方式进行修改并使用此答案stackoverflow.com/questions/861409/… 中的解决方案,但由于放弃了我需要的项目而没有完成它。
  • 我能弄明白,但解决方案有点老套。我不完全确定它为什么有效。 rtb.Document.Blocks.Add(para); rtb.Document.Blocks.Remove(rtb.Document.Blocks.FirstBlock); rtb.Document.Blocks.Add(para); 添加一个段落,删除第一个块,然后再次添加该段落摆脱了空行。之前:i.imgur.com/LVWtKkQ.png 之后:i.imgur.com/52MKbwJ.png
  • link.IsEnabled = true; 这将使 WPF 也导航到所述链接,而 RequestNavigate 将打开浏览器。将 IsEnabled 设置为 False 可防止 WPF 自行打开链接。
  • 被忽略的小细节 -- 此解决方案还需要RichtTextBox.IsDocumentEnabled=True,如原始问题中链接的页面中所述
【解决方案2】:

至于使 RichTextBox 或 TextBox 只读

TextBoxBase.IsReadOnly Property

要添加文本,您可以使用 run

    FlowDocument doc = new FlowDocument();
    rtb.Document = doc;
    rtb.IsReadOnly = true;

    Paragraph para = new Paragraph();
    doc.Blocks.Add(para);

    Hyperlink link = new Hyperlink();
    link.IsEnabled = true;
    link.Inlines.Add("Hyperlink");
    link.NavigateUri = new Uri("http://www.google.co.uk");
    para.Inlines.Add(link);
    Run run = new Run();
    run.Text = " next words";
    para.Inlines.Add(run);

【讨论】:

    【解决方案3】:

    注意:要从 RichText 中删除空白行,请执行以下操作:

    MyRichTextBox.Document.Blocks.Clear();
    

    在添加段落运行时移动 RichTextBox 开头的空格

    【讨论】:

      【解决方案4】:

      你可以这样做

        <ContentControl>
          <Span>
              <Run Text="Please visit"/>
              <Hyperlink NavigateUri="http://google.com">
                  <Run Text="google"/>
              </Hyperlink>
              <Run Text=". Thank you!"/>
          </Span>
      </ContentControl>
      

      如果您在 navigationFrame 中,您可以免费获得超链接功能

      或者……

      <StackPanel Orientation="Horizontal">
      <TextBlock Text="Please visit"/>
      <Button Style="linkButton" Content="Google" Command/Click="GotoGoogle"/>
      <TextBlock Text=". Thank you!"/>
      </StackPanel>
      

      【讨论】:

        猜你喜欢
        • 2015-04-22
        • 2014-11-15
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 2021-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多