wpf richtext box détecter le lien hypertexte

la programmation


Salut à tous, j’ai commencé à travailler sur WPF richtextbox et il semble qu’il ne dispose pas de fonctionnalités telles que la détection automatique de l’URL comme dans Windows Richtextbox. J’ai besoin d’aide pour détecter un lien hypertexte lorsque nous collons des données dans la zone de texte riche (wpf). J’ai déjà trouvé des blocs de code qui fonctionnent bien avec des mots tapés comme je tape www.google.com et lorsque j’appuie sur espace ou que j’entre la touche après “m” dans “www.google.com”, il reviendra en arrière et vérifiera l’espace précédent ou entrera et détectera le lien hypertexte et en fera un lien hypertexte.

J’ai utilisé le code suivant pour travailler avec

[^]

Cela fonctionne bien la plupart du temps mais mon problème est qu’il va au lien après avoir parcouru chaque caractère et quand j’ai beaucoup de données, ce n’est pas une meilleure solution. De plus, cela ne fonctionne pas avec plusieurs paragraphes.

J’ai essayé une autre option pour accéder directement au mot du lien, le détecter et en faire un lien hypertexte en utilisant la fonction suivante

ici match est une collection de correspondances qui contient toutes les correspondances des URL
ici, j’ai utilisé la valeur regex suivante
“(?<=\w{1})?(((ht|f)tp(s?))\://)?(www.[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk)(\ :[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&amp;%\$#\=~_\-]+))*" GetPositionAtOffset(match.index, LogicalDirection.Forward) et comprends le point
Mais j’obtiens les erreurs suivantes :

1) Le lien hypertexte ne peut pas exister dans les limites des autres (peut être capturé dans le bloc catch donc ce n’est pas un gros problème)

Quelqu’un peut-il m’aider à détecter les URL lorsque nous y collons du texte.

2) Code d’erreur 0x80131623 (peut être trouvé en détails lors d’une recherche sur Google) et vraiment un défi pour moi.

(Je m’excuse vraiment pour les erreurs de grammaire ou d’anglais)
Merci

Solution 2

Peut-être un peu d’aide ici…

Détection automatique des hyperliens dans RichTextBox – Partie I[^]
Détection automatique des hyperliens dans RichTextBox – Partie II[^]

*Modifier* Ou peut-être pas… on dirait que vous avez besoin d’aide en matière d’expression régulière, pas d’un moyen de détecter les URL… 🙂

Solution 1

Je pense que vous devez simplement vous assurer que la propriété detectorl de richtextbox est définie sur true.

Regardez le lien suivant

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

J’espère que cela est utile.


UN J

Solution 3

Je suis aux prises avec ce problème, de temps en temps, depuis plusieurs mois. Aujourd’hui, j’ai décidé de demander à Bing Chat comment procéder. J’ai donné à Bing la direction suivante : écrivez du code C# pour étendre le contrôle .net RichTextBox dans une application WPF afin que les URL soient cliquables.

Bing a fourni la solution suivante…

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

Pour étendre le contrôle .NET RichTextBox dans une application WPF à l’aide de C# afin de rendre les URL cliquables, vous pouvez utiliser la classe TextPointer pour rechercher les positions de début et de fin des URL dans le texte. Voici un exemple de création d’une méthode d’extension pour le contrôle 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);
        }
    }
}

Vous pouvez ensuite utiliser cette méthode sur n’importe quel contrôle RichTextBox de votre application WPF. Par exemple, si vous disposez d’un contrôle RichTextBox nommé myRichTextBox, vous pouvez appeler la méthode d’extension MakeUrlsClickable comme ceci :

C#
myRichTextBox.MakeUrlsClickable();

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

Cette réponse m’a amené à 80 % d’une solution. En plus de ce code, vous devez ajouter correctement un setter dans le code XAML, ainsi que du code derrière pour ce setter.

Alors, après avoir manipulé le code de Bing, voici ce que j’ai finalement implémenté…

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

Dans le code XAML :

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

Dans le code derrière :

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;
        }

L’extension du contrôle 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 vous disposez d’un contrôle RichTextBox nommé myRichTextBox, vous pouvez appeler la méthode d’extension MakeUrlsClickable comme ceci :

C#
myRichTextBox.MakeUrlsClickable();

コメント

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