cuadro de texto enriquecido wpf detecta hipervínculo

programación


Hola a todos, comencé a trabajar en WPF richtextbox y parece que no tiene funciones como la detección automática de URL como en Windows Richtextbox. Necesito ayuda para detectar hipervínculos cuando pegamos datos en el cuadro de texto enriquecido (wpf). Ya encontré algunos bloques de código que funcionan bien con palabras escritas como cuando escribo www.google.com y cuando presiono la barra espaciadora o introduzco la tecla después de “m” en “www.google.com” retrocederá y comprobará el espacio anterior o ingresará y detectará el hipervínculo y lo convertirá en hipervínculo.

Utilicé el siguiente código para trabajar

[^]

Funciona bien la mayor parte del tiempo, pero mi problema es que va al enlace después de recorrer cada carácter y cuando tengo muchos datos no es una mejor solución. Además, no funciona con varios párrafos.

Probé otra opción para saltar directamente a la palabra del enlace, detectarla y convertirla en un hipervínculo usando la siguiente función

Aquí Match es una colección de coincidencias que contiene todas las coincidencias de URL.
aquí utilicé el siguiente valor de expresión regular
“(?<=\w{1})?(((ht|f)tp(s?))\://)?(www.[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|nombre|museo|us|ca|uk)(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&amp;%\$#\=~_\-]+))*" GetPositionAtOffset(match.index, LogicalDirection.Forward) y entender el punto
Pero recibo los siguientes errores:

1) El hipervínculo no puede existir dentro del límite de otro (puede quedar atrapado en el bloque catch, por lo que no es un gran problema)

¿Alguien puede ayudarme a detectar URL cuando pegamos texto en ellas?

2) Código de error 0x80131623 (se pueden encontrar detalles cuando se busca en Google) y realmente es un desafío para mí.

(Realmente me disculpo por los errores gramaticales o de inglés)
Gracias

Solución 2

Quizás algo de ayuda aquí…

Detección automática de hipervínculos en RichTextBox – Parte I[^]
Detección automática de hipervínculos en RichTextBox – Parte II[^]

*Editar* O tal vez no… parece que necesitas ayuda con expresiones regulares, no una forma de detectar URL… 🙂

Solución 1

Creo que solo necesitas asegurarte de que la propiedad detecturl del cuadro de texto enriquecido esté establecida en verdadero.

Mira el siguiente enlace

http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.detecturls.aspx[^]

Espero que esto sea útil.


AJ

Solución 3

He estado luchando con este problema, de forma intermitente, durante varios meses. Hoy decidí preguntarle a Bing Chat cómo hacer esto. Le di a Bing la siguiente dirección: escriba código C# para ampliar el control .net RichTextBox en una aplicación WPF para que se pueda hacer clic en las URL.

Bing proporcionó la siguiente solución…

————————————————– ———————

Para ampliar el control .NET RichTextBox en una aplicación WPF usando C# para hacer que se pueda hacer clic en las URL, puede usar la clase TextPointer para buscar las posiciones inicial y final de las URL en el texto. A continuación se muestra un ejemplo de cómo crear un método de extensión para el control RichTextBox:

C#
public static class RichTextBoxExtensions
{
    public static void MakeUrlsClickable(this RichTextBox self)
    {
        TextPointer pointer = self.Document.ContentStart;
        while (pointer != null)
        {
            if (pointer.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
            {
                string textRun = pointer.GetTextInRun(LogicalDirection.Forward);
                MatchCollection matches = Regex.Matches(textRun, @"(https?://[^\s]+)");
                foreach (Match match in matches)
                {
                    TextPointer start = pointer.GetPositionAtOffset(match.Index);
                    TextPointer end = start.GetPositionAtOffset(match.Length);
                    Hyperlink hyperlink = new Hyperlink(start, end);
                    hyperlink.NavigateUri = new Uri(match.Value);
                }
            }
            pointer = pointer.GetNextContextPosition(LogicalDirection.Forward);
        }
    }
}

Luego puede usar este método en cualquier control RichTextBox en su aplicación WPF. Por ejemplo, si tiene un control RichTextBox llamado myRichTextBox, puede llamar al método de extensión MakeUrlsClickable de esta manera:

C#
myRichTextBox.MakeUrlsClickable();

————————————————– ———————

Esta respuesta me llevó al 80% a una solución. Además de ese código, debe agregar un definidor correctamente en el código XAML, además de algo de código subyacente para ese definidor.

Entonces, después de jugar con el código de Bing, esto es lo que finalmente implementé…

————————————————– ———————

En el código XAML:

XAML
<RichTextBox>
    <RichTextBox.Resources>
        <Style TargetType="Hyperlink">
            <Setter Property="Cursor" Value="Hand" />
            <EventSetter Event="MouseLeftButtonDown" Handler="Hyperlink_MouseLeftButtonDown" />
        </Style>
    </RichTextBox.Resources>
</RichTextBox>

En el código detrás:

C#
private void Hyperlink_MouseLeftButtonDown(object sender, MouseEventArgs e)
        {
            var hyperlink = (Hyperlink)sender;
            Process.Start(new ProcessStartInfo(hyperlink.NavigateUri.ToString())
            {
                UseShellExecute = true,
            });
            e.Handled = true;
        }

La extensión del control RichTextBox:

C#
namespace RichTextBoxExtensions
{
    public static class RichTextBoxExtensions
    {
        /// <summary>
        /// Scan the content of a RichTextBox control and make any https URLs
        /// clickable.  The initial version of this method was written by Bing Chat,
        /// and then tidied up by me and Intellicode.
        /// </summary>
        /// <param name="self"></param>
        public static void MakeUrlsClickable(this RichTextBox self)
        {
            TextPointer pointer = self.Document.ContentStart;
            while (pointer != null)
            {
                if (pointer.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
                {
                    string textRun = pointer.GetTextInRun(LogicalDirection.Forward);
                    MatchCollection matches = Regex.Matches(textRun, @"(https?://[^\s]+)");
                    foreach (Match match in matches.Cast<Match>())
                    {
                        TextPointer start = pointer.GetPositionAtOffset(match.Index);
                        TextPointer end = start.GetPositionAtOffset(match.Length);
                        Hyperlink hyperlink = new(start, end)
                        {
                            NavigateUri = new Uri(match.Value)
                        };
                    }
                }
                pointer = pointer.GetNextContextPosition(LogicalDirection.Forward);
            }
        }
}

Si tiene un control RichTextBox llamado myRichTextBox, puede llamar al método de extensión MakeUrlsClickable de esta manera:

C#
myRichTextBox.MakeUrlsClickable();

コメント

タイトルとURLをコピーしました