Добавьте гиперссылку к textblock wpf

Поздравления, у меня есть некоторый текст в дб, и это следующие:

Печаль Lorem ipsum находится сережка, consectetur adipiscing элита. Duis теллуры nisl, отравляет и pharetra ac, характер sed sapien. Целое число pellentesque blandit velit, в tempus urna жеманничают, находятся сережка. Duis mollis, единое время либеро consectetur interdum, теллуры Массы posuere nisi, eu aliquet элита lacus NEC erat. Praesent commodo quam. ** [href ='http://somesite.com'] некоторый сайт [/a] ** Suspendisse в nisi располагаются сережка Масса molestie gravida feugiat ac sem. Phasellus ac mauris ipsum, vel auctor odio

Мой вопрос: Как я могу отобразить a Hyperlink в a TextBlock? Я не хочу использовать управление webBrowser с этой целью. Я не хочу использовать это управление также: http://www.codeproject.com/KB/WPF/htmltextblock.aspx также

32
задан Dave Clemmer 16 September 2011 в 17:34
поделиться

2 ответа

Вы можете использовать Regex со значенным преобразователем в такой ситуации.

Используйте это для ваших требований (оригинальная идея из здесь ):

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

Это сопоставит все ссылки в ваших строках, содержащих ссылки и делают 2 именованных группы для каждого матча: ссылка ] и Текст

Теперь вы можете повторить все матчи. Каждый матч даст вам

    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
    }

ПРИМЕЧАНИЕ: Используйте эту логику в вашем пользовательском ConvertTohyHyPerlinkedText Value Converter.

15
ответ дан 27 November 2019 в 19:51
поделиться

Отображение достаточно просто, навигация - это другой вопрос. 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());
}

Редактировать: чтобы сделать это с текстом, который вы получили из базы данных, вам придется как-то разбирать текст Отказ Как только вы знаете текстовые детали и гиперссылки, вы можете динамически строить содержимое TextBlock в коде:

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");
93
ответ дан 27 November 2019 в 19:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: