2010-01-19 22 views
23

Saludos, 1 tienen algún texto en una base de datos y es de la siguiente manera:Agregar hipervínculo a WPF WPF

zanahorias de Lorem Ipsum, ecológica sopa de tomate. DUIs región nisl, sollicitudin la UE, y el aire acondicionado aljaba, tempor SED sapiens. quiere que los niños se sientan en posición vertical en una olla siempre será importante. DUIs suave, a veces como Minneapolis-libre, Massa Tellus posuere nisi, feugiat elit tempus los lagos y no había fútbol. Presente como una conveniencia. ** [ a href = 'http://somesite.com'] Algunos sitio [/ a] ** recomienda pero no es una narración televisión de masas mucho y una ensalada. Un barco, y Ipsum o autor odio

Mi pregunta es: ¿Cómo puede mostrar una Hyperlink en un 1 TextBlock? 1 no desee utilizar un control WebBrowser para este propósito. 1 no quieren utilizar este control, ya sea: http://www.codeproject.com/KB/WPF/htmltextblock.aspx también

Respuesta

13

Puede utilizar expresiones regulares con un convertidor de valores en tales situaciones.

uso esto para sus necesidades (idea original de here):

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

Esto corresponderá con todos los eslabones de la cadena que contiene enlaces, y hacer 2 grupos nombrados para cada partido: link y text

ahora se puede iterar a través de todos los partidos. Cada partido le dará una

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 
    } 

Nota: uso de esta lógica en su convertidor de valor personalizado ConvertToHyperlinkedText.

+0

Esta es una gran respuesta, gracias Mihir –

+0

No hay de qué! [:)] – mg007

76

muestra es bastante simple, la navegación es otra cuestión. XAML es la siguiente:

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

y el controlador de eventos que lanza el navegador por defecto para navegar hasta el hipervínculo sería:

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

Editar: tienes que hacerlo con el texto de base de datos que Tendrá que analizar el texto de alguna manera. Una vez que sepa las partes textuales y parte hipervínculo, se puede construir de forma dinámica el contenido de WPF en el código:

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 como 1 1 se escribió este enlace incluido en un texto que se almacena en la base de datos. 1, entonces me gustaría leer el texto y añadir hipervínculos apropiados cuando sea necesario explicación –

+0

Stanislav Gracias muy clara del hipervínculo en WPF –

+0

Gracias, esto funcionó maravillosamente! – BVB

Cuestiones relacionadas