يكتشف مربع النص المنسق wpf الارتباط التشعبي


مرحبًا جميعًا، لقد بدأت العمل على WPF richtextbox ويبدو أنه لا يحتوي على ميزات مثل الاكتشاف التلقائي لعنوان URL كما هو الحال في Windows richtextbox. أحتاج إلى مساعدة في اكتشاف الارتباط التشعبي عندما نلصق البيانات في richtextbox (wpf). لقد وجدت بالفعل بعض كتل التعليمات البرمجية التي تعمل بشكل جيد مع الكلمات المكتوبة مثل كتابة www.google.com وعندما أضغط على مسافة أو أدخل المفتاح بعد “m” في “www.google.com” سوف يجتاز مرة أخرى ويتحقق من المساحة السابقة أو يدخل ويكتشف الارتباط التشعبي ويجعله ارتباطًا تشعبيًا.

لقد استخدمت الكود التالي للعمل معه

[^]

إنه يعمل بشكل جيد في معظم الأوقات ولكن مشكلتي هي أنه ينتقل إلى الرابط بعد اجتياز كل حرف وعندما يكون لدي الكثير من البيانات، فهذا ليس حلاً أفضل. كما أنه لا يعمل مع فقرات متعددة.

لقد جربت خيارًا آخر للانتقال مباشرة إلى كلمة الرابط واكتشافه وجعله رابطًا تشعبيًا باستخدام الوظيفة التالية

هنا Match عبارة عن مجموعة مطابقة تحتوي على جميع مطابقات عناوين url
هنا استخدمت قيمة regex التالية
“(?<=\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) والحصول على هذه النقطة
لكني أتلقى الأخطاء التالية:

1) لا يمكن أن يكون الارتباط التشعبي موجودًا في حدود الارتباطات الأخرى (يمكن اكتشافه في كتلة الالتقاط، لذلك لا يمثل مشكلة كبيرة)

هل يمكن لأي شخص مساعدتي في اكتشاف عناوين URL عندما نلصق النص فيها.

2) رمز الخطأ 0x80131623 (يمكن العثور على التفاصيل عند البحث في Google) ويمثل تحديًا حقيقيًا بالنسبة لي.

(أعتذر حقًا عن الأخطاء النحوية أو الإنجليزية)
شكرًا

الحل 2

ربما بعض المساعدة هنا…

الكشف التلقائي عن الارتباطات التشعبية في RichTextBox – الجزء الأول[^]
الكشف التلقائي عن الارتباطات التشعبية في RichTextBox – الجزء الثاني[^]

*تعديل* أو ربما لا…يبدو أنك بحاجة إلى مساعدة regex، وليس طريقة لاكتشاف عناوين URL… 🙂

الحل 1

أعتقد أنك تحتاج فقط إلى التأكد من تعيين خاصية Detecturl الخاصة بـ richtextbox على القيمة true.

انظر إلى الرابط التالي

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

نأمل أن يكون هذا مفيدا.


اي جي

الحل 3

لقد كنت أعاني من هذه المشكلة، متقطعة، لعدة أشهر. قررت اليوم أن أسأل Bing Chat عن كيفية القيام بذلك. أعطيت Bing الاتجاه التالي: اكتب رمز c# لتوسيع عنصر التحكم .net RichTextBox في تطبيق WPF بحيث تكون عناوين URL قابلة للنقر عليها.

قدم Bing الحل التالي …

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

لتوسيع عنصر تحكم .NET RichTextBox في تطبيق WPF باستخدام C# لجعل عناوين URL قابلة للنقر عليها، يمكنك استخدام فئة TextPointer للعثور على موضعي البداية والنهاية لعناوين URL في النص. فيما يلي مثال لكيفية إنشاء أسلوب ملحق لعنصر التحكم RichTextBox:

ج#
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);
        }
    }
}

يمكنك بعد ذلك استخدام هذه الطريقة على أي عنصر تحكم RichTextBox في تطبيق WPF الخاص بك. على سبيل المثال، إذا كان لديك عنصر تحكم RichTextBox المسمى myRichTextBox، فيمكنك استدعاء أسلوب الامتداد MakeUrlsClickable مثل هذا:

ج#
myRichTextBox.MakeUrlsClickable();

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

هذه الإجابة أوصلتني إلى الحل بنسبة 80٪. بالإضافة إلى هذا الرمز، يجب عليك إضافة أداة ضبط بشكل صحيح في رمز XAML، بالإضافة إلى بعض التعليمات البرمجية الموجودة خلف ذلك أداة الضبط.

لذا، بعد العبث بكود Bing، إليك ما قمت بتنفيذه أخيرًا…

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

في كود XAML:

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

في الكود خلف:

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

ملحق عنصر التحكم RichTextBox:

ج#
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);
            }
        }
}

إذا كان لديك عنصر تحكم RichTextBox المسمى myRichTextBox، فيمكنك استدعاء طريقة الامتداد MakeUrlsClickable مثل هذا:

ج#
myRichTextBox.MakeUrlsClickable();

コメント

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