hộp văn bản phong phú wpf phát hiện siêu liên kết

lập trình


Xin chào tất cả mọi người, tôi đã bắt đầu làm việc trên richtextbox WPF và có vẻ như nó không có các tính năng như tự động phát hiện url như trong richtextbox của windows. Tôi cần trợ giúp trong việc phát hiện siêu liên kết khi chúng tôi dán dữ liệu vào richtextbox (wpf). Tôi đã tìm thấy một số khối mã hoạt động tốt với các từ được nhập như tôi nhập www.google.com và khi tôi nhấn phím cách hoặc phím enter sau “m” trong “www.google.com” nó sẽ quay lại và kiểm tra khoảng trống trước đó hoặc nhập và phát hiện siêu liên kết và biến nó thành siêu liên kết.

Tôi đã sử dụng mã sau đây để làm việc với

[^]

Nó hoạt động tốt hầu hết thời gian nhưng vấn đề của tôi là nó đi đến liên kết sau khi duyệt qua từng ký tự và khi tôi có nhiều dữ liệu thì đó không phải là giải pháp tốt hơn. Ngoài ra nó không hoạt động với nhiều đoạn văn.

Tôi đã thử một tùy chọn khác để chuyển trực tiếp đến từ liên kết và phát hiện nó và tạo siêu liên kết bằng chức năng sau

ở đây trận đấu là một bộ sưu tập trận đấu chứa tất cả các trận đấu của url
ở đây tôi đã sử dụng giá trị biểu thức chính quy sau
“(?<=\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) và nhận được điểm
Nhưng tôi nhận được các lỗi sau:

1) Siêu liên kết không thể tồn tại trong ranh giới của khác (có thể bị kẹt trong khối bắt nên không phải là vấn đề lớn)

Ai đó có thể vui lòng giúp tôi phát hiện các url khi chúng tôi dán văn bản vào đó không.

2) Mã lỗi 0x80131623 (có thể tìm thấy chi tiết khi tìm trên Google) và thực sự gây khó khăn cho tôi.

(Tôi thực sự xin lỗi vì những lỗi ngữ pháp hoặc tiếng Anh)
Cảm ơn

Giải pháp 2

Có lẽ một số trợ giúp ở đây …

Tự động phát hiện siêu liên kết trong RichTextBox – Phần I[^]
Tự động phát hiện siêu liên kết trong RichTextBox – Phần II[^]

*Chỉnh sửa* Hoặc có thể không…có vẻ như bạn cần trợ giúp về biểu thức chính quy chứ không phải cách phát hiện URL… 🙂

Giải pháp 1

Tôi nghĩ bạn chỉ cần đảm bảo rằng thuộc tính detecturl của richtextbox được đặt thành true.

Nhìn vào liên kết sau

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

Hy vọng điều này hữu ích.


AJ

Giải pháp 3

Tôi đã phải vật lộn với vấn đề này liên tục trong vài tháng. Hôm nay, tôi quyết định hỏi Bing Chat cách thực hiện việc này. Tôi đã đưa ra hướng dẫn cho Bing như sau: viết mã C# để mở rộng điều khiển .net RichTextBox trong ứng dụng WPF để có thể nhấp vào các url.

Bing đã cung cấp giải pháp sau…

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

Để mở rộng điều khiển .NET RichTextBox trong ứng dụng WPF bằng C# nhằm làm cho URL có thể nhấp được, bạn có thể sử dụng lớp TextPointer để tìm vị trí bắt đầu và kết thúc của URL trong văn bản. Dưới đây là ví dụ về cách tạo phương thức mở rộng cho điều khiển 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);
        }
    }
}

Sau đó, bạn có thể sử dụng phương pháp này trên bất kỳ điều khiển RichTextBox nào trong ứng dụng WPF của mình. Ví dụ: nếu bạn có điều khiển RichTextBox có tên myRichTextBox, bạn có thể gọi phương thức mở rộng MakeUrlsClickable như sau:

C#
myRichTextBox.MakeUrlsClickable();

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

Câu trả lời này đã giúp tôi đạt được 80% giải pháp. Ngoài mã đó, bạn phải thêm bộ cài đặt chính xác vào mã XAML, cùng với một số mã phía sau cho bộ cài đặt đó.

Vì vậy, sau khi loay hoay với mã của Bing, đây là những gì cuối cùng tôi đã triển khai…

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

Trong mã XAML:

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

Trong mã phía sau:

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

Phần mở rộng cho điều khiển 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);
            }
        }
}

Nếu bạn có điều khiển RichTextBox có tên myRichTextBox, bạn có thể gọi phương thức mở rộng MakeUrlsClickable như thế này:

C#
myRichTextBox.MakeUrlsClickable();

コメント

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