डब्ल्यूपीएफ रिचटेक्स्ट बॉक्स हाइपरलिंक का पता लगाता है


नमस्कार, मैंने डब्ल्यूपीएफ रिचटेक्स्टबॉक्स पर काम करना शुरू कर दिया है और ऐसा लगता है कि इसमें विंडोज़ रिचटेक्स्टबॉक्स की तरह ऑटो डिटेक्ट यूआरएल जैसी सुविधाएं नहीं हैं। जब हम रिचटेक्स्टबॉक्स (डब्ल्यूपीएफ) में डेटा पेस्ट करते हैं तो मुझे हाइपरलिंक का पता लगाने में मदद की ज़रूरत होती है। मुझे पहले से ही कुछ कोड ब्लॉक मिल गए हैं जो टाइप किए गए शब्दों के साथ ठीक काम करते हैं जैसे कि मैं www.google.com टाइप करता हूं और जब मैं “एम” के बाद स्पेस दबाता हूं या कुंजी दर्ज करता हूं। “www.google.com” यह पीछे जाएगा और पिछले स्थान की जांच करेगा या हाइपरलिंक दर्ज करेगा और उसका पता लगाएगा और इसे हाइपरलिंक बना देगा।

मैंने काम करने के लिए निम्नलिखित कोड का उपयोग किया

[^]

यह अधिकांश समय ठीक काम करता है लेकिन मेरी समस्या यह है कि यह प्रत्येक चरित्र को पार करने के बाद लिंक पर जाता है और जब मेरे पास बहुत अधिक डेटा होता है तो यह बेहतर समाधान नहीं होता है। साथ ही यह एकाधिक अनुच्छेदों के साथ काम नहीं करता है।

मैंने सीधे लिंक शब्द पर जाने और इसका पता लगाने और निम्नलिखित फ़ंक्शन का उपयोग करके इसे हाइपरलिंक बनाने का एक और विकल्प आज़माया

यहां मैच एक मैच संग्रह है जिसमें यूआरएल के सभी मिलान शामिल हैं
यहां मैंने निम्नलिखित रेगेक्स मान का उपयोग किया है
“(?<=\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) हाइपरलिंक दूसरे की सीमा में मौजूद नहीं हो सकता (कैच ब्लॉक में पकड़ा जा सकता है इसलिए कोई बड़ी समस्या नहीं है)

जब हम इसमें टेक्स्ट पेस्ट करते हैं तो क्या कोई यूआरएल का पता लगाने में मेरी मदद कर सकता है।

2)त्रुटि कोड 0x80131623 (Google पर खोजने पर विवरण पाया जा सकता है) और वास्तव में मेरे लिए चुनौतीपूर्ण है।

(व्याकरण संबंधी या अंग्रेजी की गलतियों के लिए मैं सचमुच माफी चाहता हूं)
धन्यवाद

समाधान 2

शायद यहां कुछ मदद मिले…

RichTextBox में हाइपरलिंक का स्वतः पता लगाना – भाग I[^]
रिचटेक्स्टबॉक्स में हाइपरलिंक का स्वतः पता लगाना – भाग II[^]

*संपादित करें* या शायद नहीं…ऐसा लगता है कि आपको रेगेक्स सहायता की आवश्यकता है, यूआरएल का पता लगाने के तरीके की नहीं… 🙂

समाधान 1

मुझे लगता है कि आपको बस यह सुनिश्चित करने की ज़रूरत है कि richtextbox की डिटेक्टुरल प्रॉपर्टी सत्य पर सेट है।

निम्नलिखित लिंक देखें

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

आशा है यह सहायक होगा.


ए जे

समाधान 3

मैं कई महीनों से लगातार इस समस्या से जूझ रहा हूं। आज, मैंने बिंग चैट से यह पूछने का निर्णय लिया कि यह कैसे करें। मैंने बिंग को निम्नलिखित निर्देश दिया: WPF एप्लिकेशन में .net RichTextBox नियंत्रण को बढ़ाने के लिए C# कोड लिखें ताकि यूआरएल क्लिक करने योग्य हो।

बिंग ने निम्नलिखित समाधान प्रदान किया…

————————————————– ———————-

URL को क्लिक करने योग्य बनाने के लिए C# का उपयोग करके WPF एप्लिकेशन में .NET RichTextBox नियंत्रण का विस्तार करने के लिए, आप टेक्स्ट में URL की आरंभ और समाप्ति स्थिति खोजने के लिए TextPointer क्लास का उपयोग कर सकते हैं। 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);
        }
    }
}

फिर आप इस विधि का उपयोग अपने WPF एप्लिकेशन में किसी भी RichTextBox नियंत्रण पर कर सकते हैं। उदाहरण के लिए, यदि आपके पास myRichTextBox नाम का RichTextBox नियंत्रण है, तो आप MakeUrlsClickable एक्सटेंशन विधि को इस तरह कॉल कर सकते हैं:

सी#
myRichTextBox.MakeUrlsClickable();

————————————————– ———————-

इस उत्तर से मुझे 80% समाधान मिल गया। उस कोड के अलावा, आपको 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);
            }
        }
}

यदि आपके पास myRichTextBox नाम का एक RichTextBox नियंत्रण है, तो आप MakeUrlsClickable एक्सटेंशन विधि को इस तरह कॉल कर सकते हैं:

सी#
myRichTextBox.MakeUrlsClickable();

コメント

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