2009-04-17 15 views
9

मेरे पास isReadOnlyTrue पर एक WPF RichTextBox है। मैं चाहता हूं कि उपयोगकर्ता RichTextBox में निहित हाइपरलिंक्स पर क्लिक कर सकें, बिना Ctrl दबाए रखें।CTRL को दबाए बिना रिचटेक्स्टबॉक्स में हाइपरलिंक पर क्लिक करना - WPF

हाइपरलिंक पर क्लिक ईवेंट आग लगने लगती है जब तक Ctrl दबाया जाता है, इसलिए मुझे आगे बढ़ने के बारे में अनिश्चितता है।

+2

पहले से ही स्कीट का धन्यवाद कर रहा है? बहुत मुश्किल! – Anthony

+0

@ एंथनी, यह एक हस्ताक्षर था (वर्तनी को देखो) – JaredPar

+1

हेहे, मैं वास्तव में जॉन हूं, लेकिन यदि स्कीट आती है, तो मैं निश्चित रूप से उसका धन्यवाद करूंगा :) –

उत्तर

3

इसके आसपास एक रास्ता खोजने के लिए प्रबंधित, दुर्घटना से काफी ज्यादा।

मेरी RichTextBox में लोड की गई सामग्री बस एक सादा स्ट्रिंग के रूप में संग्रहीत (या इनपुट) है। मैंने RichTextBox को इसके दस्तावेज़ दस्तावेज़ के विरुद्ध बाध्य करने की अनुमति देने के लिए उप-वर्गीकृत किया है।

FlowDocument doc = new FlowDocument(); 
Paragraph graph = new Paragraph(); 

Hyperlink textLink = new Hyperlink(new Run(textSplit)); 
textLink.NavigateUri = new Uri(textSplit); 
textLink.RequestNavigate += 
    new System.Windows.Navigation.RequestNavigateEventHandler(navHandler); 

graph.Inlines.Add(textLink); 
graph.Inlines.Add(new Run(nonLinkStrings)); 

doc.Blocks.Add(graph); 

return doc; 

यह मैं हो जाता है:

क्या प्रश्न के लिए प्रासंगिक है, कि मुझे लगता है कि इस तरह दिखता है एक IValueConverter Convert() अधिभार (कोड समाधान के लिए गैर जरूरी बाहर छीन लिया गया है) है व्यवहार मैं चाहता हूं (रिचटेक्स्टबॉक्स में सादे तारों को बदल रहा है और स्वरूपण प्राप्त कर रहा हूं) और यह उन लिंक में भी परिणाम देता है जो एक सामान्य दस्तावेज़ की तरह व्यवहार करते हैं, जो किसी वर्ड दस्तावेज़ में एम्बेड किए गए हैं।

+0

var textSplit कहां और कैसे बनाया गया? –

+0

इस उत्तर में सबसे ऊपर उठना चाहिए। –

0

क्या आपने क्लिक ईवेंट के बजाय MouseLeftButtonDown ईवेंट को संभालने का प्रयास किया है?

17

मुझे एक समाधान मिला। IsDocument को "True" पर सेट करें और केवल "True" पर IsRead सेट करें।

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

एक बार मैं ऐसा किया, माउस जब मैं एक पाठ हाइपरलिंक टैग के भीतर प्रदर्शित किया पर ले जाएं, एक 'के हाथ' में बदल जाते हैं जाएगा। नियंत्रण रखने के बिना क्लिक करने से 'क्लिक' ईवेंट आग लग जाएगी।

मैं .NET 4 से WPF का उपयोग कर रहा हूं। मुझे नहीं पता कि .NET के पुराने संस्करण कार्य नहीं करते हैं जैसा कि मैंने उपरोक्त वर्णन किया है।

+5

इस प्रतिलिपि को कॉपी और पेस्ट उद्देश्यों के लिए टेक्स्ट को अचयनित करने का असरदार दुष्प्रभाव है। – Julien

10

JHubbard80 का उत्तर एक संभावित समाधान है, यदि आपको चयनित सामग्री की आवश्यकता नहीं है तो यह सबसे आसान तरीका है।

हालांकि मुझे इसकी आवश्यकता है: पी यहां मेरा दृष्टिकोण है: 10 के लिए RichTextBox के अंदर एक शैली सेट करें। एस MouseLeftButtonDown ईवेंट को संभालने के लिए EventSetter का उपयोग करना आवश्यक है।

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

और codebehind में:

private void Hyperlink_MouseLeftButtonDown(object sender, MouseEventArgs e) 
{ 
    var hyperlink = (Hyperlink)sender; 
    Process.Start(hyperlink.NavigateUri.ToString()); 
} 

inspiaration के लिए gcores के लिए धन्यवाद।

+0

मुझे हाथ नहीं मिला, लेकिन जो भी हो। यह काम करता है, और इससे भी बेहतर, मुझे हाइपरलिंक के नेविगेशन कोड तक पहुंच प्रदान करता है - इसलिए यदि कोई निर्देशिका मौजूद नहीं है, तो मेरा ऐप क्रैश नहीं होता है! – Darkhydro

+0

क्लिक इवेंट को संभालने के लिए मेरे लिए काम किया।यह एक विंडोज 10/डब्ल्यूपीएफ 4.5 चीज हो सकती है लेकिन यह काम करता है। धन्यवाद। –