2010-01-19 2 views
23

Привет, 1 есть некоторый текст на БД и выглядит следующим образом:Добавить гиперссылку МОФ WPF

Lorem Ipsum морковь, экологический томатный суп. DUIs область nisl, sollicitudin ес, и колчан ас, TEMPOR СЕПГ Sapien. хочет ребенок сидеть прямо в горшке всегда будет иметь важное значение. DUIs мягкие, времена как Миннеаполис свободный, Massa Tellus Дознание НИСИ, feugiat Элиты Tempus озеры и не было никакого футбола. Present удобства. ** [ A HREF = 'http://somesite.com'] Некоторый сайт [/ а] ** Рекомендуется, но не много массового телевидения рассказывание и салат. Лодка и Ipsum или автор ненависть

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

ответ

13

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

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

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

Это будет соответствовать всем ссылкам в строке, содержащие ссылки, и сделать 2 именованных группы для каждого матча: link и text

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

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 
    } 

Примечание: использовать данную логику в конверторе значения пользовательских ConvertToHyperlinkedText.

+0

Это отличный ответ, спасибо Mihir –

+0

Добро пожаловать! [:)] – mg007

76

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

Edit: вы должны сделать это с текстом из базы данных, «придется разобрать текст каким-то образом. После того, как вы знаете, текстуальные части и гиперссылкой часть, вы можете построить МОФ содержимое динамически в коде:

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"); 
+1

yes..but, как 1 1 уже написал эту ссылку включены в какой-нибудь текст, который хранится в БД. 1, то хотел бы, чтобы прочитать текст и добавить соответствующие гиперссылки при необходимости –

+0

Станислав Благодаря очень четкое объяснение гиперссылки в WPF –

+0

Спасибо, это работает чудесно! – BVB

Смежные вопросы