kotak teks kaya wpf mendeteksi hyperlink

pemrograman


Halo semuanya Saya mulai mengerjakan richtextbox WPF dan sepertinya tidak memiliki fitur seperti deteksi otomatis url seperti di windows richtextbox. Saya memerlukan bantuan dalam mendeteksi hyperlink ketika kita menempelkan data di richtextbox (wpf). Saya sudah menemukan beberapa blok kode yang berfungsi baik dengan kata-kata yang diketik seperti saya mengetik www.google.com dan ketika saya menekan spasi atau tombol enter setelah “m” di “www.google.com” itu akan melintasi kembali dan memeriksa ruang sebelumnya atau masuk dan mendeteksi hyperlink dan menjadikannya hyperlink.

Saya menggunakan kode berikut untuk bekerja dengannya

[^]

Ini berfungsi dengan baik sebagian besar waktu tetapi masalah saya adalah ia menuju ke tautan setelah melintasi setiap karakter dan ketika saya memiliki banyak data, itu bukan solusi yang lebih baik. Juga tidak berfungsi dengan banyak paragraf.

Saya mencoba opsi lain untuk melompat langsung ke kata tautan dan mendeteksinya serta menjadikannya hyperlink menggunakan fungsi berikut

di sini kecocokan adalah kumpulan kecocokan yang berisi semua kecocokan url
di sini saya menggunakan nilai regex berikut
“(?<=\w{1})?(((ht|f)tp(s?))\://)?(www.[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|nama|museum|us|ca|uk)(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&amp;%\$#\=~_\-]+))*" GetPositionAtOffset(match.index, LogicalDirection.Forward) dan mengerti maksudnya
Tapi saya mendapatkan kesalahan berikut:

1) Hyperlink tidak bisa ada di batasan lain (bisa terjebak di blok tangkapan jadi bukan masalah besar)

Adakah yang bisa membantu saya mendeteksi url saat kami menempelkan teks di dalamnya.

2) Kode kesalahan 0x80131623 (dapat ditemukan detailnya saat mencari di Google) dan sangat menantang bagi saya.

(Saya benar-benar minta maaf atas kesalahan tata bahasa atau bahasa Inggris)
Terima kasih

Solusi 2

Mungkin ada bantuan di sini…

Mendeteksi Hyperlink secara otomatis di RichTextBox – Bagian I[^]
Mendeteksi Hyperlink secara otomatis di RichTextBox – Bagian II[^]

*Edit* Atau mungkin tidak…sepertinya Anda memerlukan bantuan regex, bukan cara mendeteksi URL… 🙂

Solusi 1

Saya pikir Anda hanya perlu memastikan bahwa properti detector dari richtextbox disetel ke true.

Lihatlah tautan berikut

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

Semoga ini bermanfaat.


AJ

Solusi 3

Saya telah berjuang dengan masalah ini, berulang kali, selama beberapa bulan. Hari ini, saya memutuskan untuk bertanya kepada Bing Chat bagaimana melakukan ini. Saya memberi Bing arahan berikut: tulis kode c# untuk memperluas kontrol .net RichTextBox di aplikasi WPF sehingga url dapat diklik.

Bing memberikan solusi berikut…

————————————————— —————————

Untuk memperluas kontrol .NET RichTextBox di aplikasi WPF menggunakan C# agar URL dapat diklik, Anda bisa menggunakan kelas TextPointer untuk menemukan posisi awal dan akhir URL dalam teks. Berikut ini contoh cara membuat metode ekstensi untuk kontrol 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);
        }
    }
}

Anda kemudian dapat menggunakan metode ini pada kontrol RichTextBox mana pun di aplikasi WPF Anda. Misalnya, jika Anda memiliki kontrol RichTextBox bernama myRichTextBox, Anda dapat memanggil metode ekstensi MakeUrlsClickable seperti ini:

C#
myRichTextBox.MakeUrlsClickable();

————————————————— —————————

Jawaban ini memberi saya 80% solusi. Selain kode tersebut, Anda harus menambahkan setter dengan benar pada kode XAML, ditambah beberapa kode di belakang untuk setter tersebut.

Jadi, setelah mengutak-atik kode Bing, inilah yang akhirnya saya terapkan…

————————————————— —————————

Dalam kode XAML:

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

Dalam kode di belakang:

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

Ekstensi ke kontrol 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);
            }
        }
}

Jika Anda memiliki kontrol RichTextBox bernama myRichTextBox, Anda dapat memanggil metode ekstensi MakeUrlsClickable seperti ini:

C#
myRichTextBox.MakeUrlsClickable();

コメント

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