首页 文章

添加到textblock wpf的超链接

提问于
浏览
28

问候,我在db中有一些文本,它如下:

Lorem ipsum dolor sit amet,consectetur adipiscing elit . Duis tellus nisl,venenatis et pharetra ac,tempor sed sapien . 整齐的pellentesque blandit velit,在tempus urna semper坐下来 . Duis mollis,libero ut consectetur interdum,massa tellus posuere nisi,eu aliquet elit lacus nec erat . 赞美商品 . ** [a href ='http://somesite.com']某个网站[/ a] **在nisi的Suspendisse坐在amet massa molestie gravida feugiat ac sem . Phasellus ac mauris ipsum,vel auctor odio

我的问题是:如何在_1356025中显示 Hyperlink ?我不想_1156026_也想使用这个控件:http://www.codeproject.com/KB/WPF/htmltextblock.aspx

2 回答

  • 15

    在这种情况下,您可以将Regex与值转换器一起使用 .

    使用此符合您的要求(来自here的原创想法):

    private Regex regex = 
            new Regex(@"\[a\s+href='(?<link>[^']+)'\](?<text>.*?)\[/a\]",
            RegexOptions.Compiled);
    

    这将匹配包含链接的字符串中的所有链接,并为每个匹配创建2个命名组: linktext

    现在您可以遍历所有匹配项 . 每场比赛都会给你一个

    foreach (Match match in regex.Matches(stringContainingLinks))
        { 
            string link    = match.Groups["link"].Value;
            int link_start = match.Groups["link"].Index;
            int link_end   = match.Groups["link"].Index + link.Length;
    
            string text    = match.Groups["text"].Value;
            int text_start = match.Groups["text"].Index;
            int text_end   = match.Groups["text"].Index + text.Length;
    
            // do whatever you want with stringContainingLinks.
            // In particular, remove whole `match` ie [a href='...']...[/a]
            // and instead put HyperLink with `NavigateUri = link` and
            // `Inlines.Add(text)` 
            // See the answer by Stanislav Kniazev for how to do this
        }
    

    Note : 在自定义 ConvertToHyperlinkedText 值转换器中使用此逻辑 .

  • 82

    显示相当简单,导航是另一个问题 . XAML是这样的:

    <TextBlock Name="TextBlockWithHyperlink">
        Some text 
        <Hyperlink 
            NavigateUri="http://somesite.com"
            RequestNavigate="Hyperlink_RequestNavigate">
            some site
        </Hyperlink>
        some more text
    </TextBlock>
    

    启动默认浏览器以导航到超链接的事件处理程序将是:

    private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) {
        System.Diagnostics.Process.Start(e.Uri.ToString());
    }
    

    编辑:要使用从数据库获得的文本来执行此操作,您必须以某种方式解析文本 . 一旦知道了文本部分和超链接部分,就可以在代码中动态构建文本块内容:

    TextBlockWithHyperlink.Inlines.Clear();
    TextBlockWithHyperlink.Inlines.Add("Some text ");
    Hyperlink hyperLink = new Hyperlink() {
        NavigateUri = new Uri("http://somesite.com")
    };
    hyperLink.Inlines.Add("some site");
    hyperLink.RequestNavigate += Hyperlink_RequestNavigate;
    TextBlockWithHyperlink.Inlines.Add(hyperLink);
    TextBlockWithHyperlink.Inlines.Add(" Some more text");
    

相关问题