Поздравления, у меня есть некоторый текст в дб, и это следующие:
Печаль 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 также
Вы можете использовать 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.
Отображение достаточно просто, навигация - это другой вопрос. 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");