سؤال

لقد وجدت نفسي تحديًا جديدًا: اصنع معالج كلمات في التعامل مع الويب أكثر من النص العادي. إن تصميم إطار جميل لهذا هو ما لا أستطيع الانتظار للبدء به ، لكنني بحاجة إلى معرفة ما هي الاحتمالات في جانب واجهة المستخدم الرسومية (من المحتمل أن تواجه الكثير من تحديات واجهة المستخدم الرسومية).

لذا فإن الشيء الأساسي الذي أحتاجه نوعًا من التحكم حيث يمكنني جعل أجزاء من النص القابل للنقر / الماوس قادرًا.

أنا جديد نوعًا ما على WPF ولست متأكدًا من كيفية القيام بذلك. هل لدى أي شخص فكرة عن كيفية صنع هذا؟ هل هناك أمثلة؟ هل هناك بالفعل عناصر تحكم لهذا؟

شكرا مقدما

تعديل:

اكتشفت بطريقة ما للقيام بذلك باستخدام RichTextBox:

// Create a FlowDocument to contain content for the RichTextBox.
FlowDocument myFlowDoc = new FlowDocument();

// Add paragraphs to the FlowDocument.

Hyperlink myLink = new Hyperlink();
myLink.Inlines.Add("hyperlink");
myLink.NavigateUri = new Uri("http://www.stackoverflow.com");

// Create a paragraph and add the Run and hyperlink to it.
Paragraph myParagraph = new Paragraph();
myParagraph.Inlines.Add("check this link out: ");
myParagraph.Inlines.Add(myLink);
myFlowDoc.Blocks.Add(myParagraph);

// Add initial content to the RichTextBox.
richTextBox1.Document = myFlowDoc;

أحصل الآن على ارتباط تشعبي لطيف في مربع النص الخاص بي ... إلا عندما انقر فوقه ، لا شيء يحدث. ماذا أفتقد هنا؟

هل كانت مفيدة؟

المحلول

يمكنك استخدام ال ارتباط تشعبي صف دراسي. إنه FrameworkContEntElement ، بحيث يمكنك استخدامه في نص textblock أو FlowDocument أو في أي مكان آخر يمكنك تضمينه.

<TextBlock>
    <Run>Text</Run>
    <Hyperlink NavigateUri="http://stackoverflow.com">with</Hyperlink>
    <Run>some</Run>
    <Hyperlink NavigateUri="http://google.com">hyperlinks</Hyperlink>
</TextBlock>

قد ترغب في النظر في استخدام أ RichTextBox كجزء من المحرر الخاص بك. سيستضيف هذا FlowDocument ، والذي يمكن أن يحتوي على محتوى مثل الارتباطات التشعبية.


تحديث: هناك طريقتان للتعامل مع النقرات على الارتباط التشعبي. واحد هو التعامل مع طلب حدث. إنها حدث موجه, ، بحيث يمكنك إما إرفاق معالج بالارتباط التشعبي نفسه أو يمكنك إرفاق واحد بعنصر أعلى في الشجرة مثل النافذة أو RichTextbox:

// On a specific Hyperlink
myLink.RequestNavigate +=
    new RequestNavigateEventHandler(RequestNavigateHandler);
// To handle all Hyperlinks in the RichTextBox
richTextBox1.AddHandler(Hyperlink.RequestNavigateEvent,
    new RequestNavigateEventHandler(RequestNavigateHandler));

الطريقة الأخرى هي الاستخدام آمر عن طريق ضبط يأمر خاصية على الارتباط التشعبي إلى أنا أمر تطبيق. سيتم استدعاء الطريقة التي تم تنفيذها على ICommand عند النقر فوق الارتباط التشعبي.

إذا كنت ترغب في إطلاق متصفح في المعالج ، فيمكنك تمرير URI إلى العملية:

private void RequestNavigateHandler(object sender, RequestNavigateEventArgs e)
{
    Process.Start(e.Uri.ToString());
}

نصائح أخرى

لاحظ أنك تحتاج أيضًا إلى تعيين الخصائص التالية على RichTextBox أو سيتم تعطيل الارتباطات التشعبية ولن يتم إطلاق النار على الأحداث. بدون isreadonly ، تحتاج إلى انقر فوق الارتباطات التشعبية ، مع isreadonly يطلقون النار بنقرة يسارية منتظمة.

<RichTextBox
    IsDocumentEnabled="True"
    IsReadOnly="True">

أبسط طريقة هي التعامل مع حدث طلب مثل هذا:


...
myLink.RequestNavigate += HandleRequestNavigate;
...

private void HandleRequestNavigate(object sender, RoutedEventArgs e)
{
   var link = (Hyperlink)sender;
   var uri = link.NavigateUri.ToString();
   Process.Start(uri);
   e.Handled = true;
}

هناك بعض المشكلات المتعلقة ببدء تشغيل متصفح افتراضي عن طريق تمرير عنوان URL إلى العملية. وابدأ ، وقد ترغب في Google للحصول على طريقة أفضل لتنفيذ المعالج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top