2009-10-15 12 views
5

मैं इस XAML है:नेस्टेड टेक्स्टब्लॉक और हाइपरलिंक्स, आप इस एक्सएएमएल को सी # में कैसे दोहराते हैं?

<TextBlock TextWrapping="Wrap" Foreground="Green" 
      Text="This is some Green text up front. "> 
    <TextBlock Foreground="Blue"> 
     This is some Blue text. 
    </TextBlock> 
    This is some Green text following the Blue text. 
    <Hyperlink> 
     <TextBlock Text="And finally, this is a Hyperlink." TextWrapping="Wrap"/> 
    </Hyperlink> 
</TextBlock> 

और मुझे पता है कि कैसे यह सी # में procedurally में दोहराना चाहते हैं।

TextBlock tb = new TextBlock(); 
tb.Text="Some text" 

और मैं सी # के भीतर एक कक्ष में एकाधिक TextBlock एक साथ है डाल सकते हैं:

मैं की तरह कुछ के साथ सी # में TextBlock रों बनाने का तरीका पता है। लेकिन मुझे नहीं लगता कि आप TextBlock एस को अन्य TextBlock एस, और TextBlock एस Hyperlink में TextBlock एस में डालने के बारे में कैसे देखते हैं।

क्या कुछ कंटेनर ऑब्जेक्ट्स और अतिरिक्त TextBlock ऑब्जेक्ट स्वचालित रूप से बनाए जा रहे हैं, किसी भी तरह? या TextBlock में कुछ विधियां/गुण हैं जो इसे अन्य आइटम रखने की अनुमति देते हैं?

अन्य संबंधित प्रश्न:
1. क्लिक() ईवेंट जैसे Hyperlink पर कुछ जोड़ने का सबसे अच्छा तरीका क्या है?
2. क्या नीली पाठ को अधिक साफ तरीके से लपेटने का कोई तरीका है? उपर्युक्त एक्सएएमएल में, जैसे ही सही शब्द को लपेटने की आवश्यकता होगी, नीले पाठ का पूरा ब्लॉक इसके बजाय लपेटा जाएगा।

किसी भी रोशनी के लिए धन्यवाद जो आप प्रदान कर सकते हैं।

उत्तर

1

मुझे टेक्स्टब्लॉक के बारे में पता नहीं है, लेकिन यहां यह है कि आप इसे RichTextBox में कैसे करेंगे। आप टेक्स्टब्लॉक के बजाय RichTextBox का उपयोग कर सकते हैं।

RichTextBox rtbTest = new RichTextBox(); 
rtbTest.IsDocumentEnabled = true; 

FlowDocument fd = new FlowDocument(); 
Paragraph para = new Paragraph(); 

Run r4 = new Run("Some Text To Show As Hyperlink"); 
Hyperlink h4 = new Hyperlink(r4); 
h4.Foreground = Brushes.Red; //whatever color you want the HyperLink to be 

// If you want the Hyperlink clickable 
h4.NavigateUri = new Uri("Some URL"); 
h4.RequestNavigate += new RequestNavigateEventHandler(h_RequestNavigate); 
// Leaving the two previous lines out will still make the Hyperlink, but it won't be clickable 

// use this if you don't want an underline under the HyperLink 
h4.TextDecorations = null; 

para.Inlines.Add(h4); 

fd.Blocks.Add(para); 

rtbTest.Document = fd; 

सामान्य पाठ के लिए, मैंने अभी हाइपरलिंक का उपयोग किया है, लेकिन दो लाइनों को हटा दिया है जो इसे क्लिक करने योग्य बनाते हैं। यह पाठ को रंग देगा, लेकिन यह क्लिक करने योग्य नहीं होगा। हालांकि यह अभी भी कर्सर बदलता है। हालांकि मुझे यकीन है कि इसे बदलने के लिए एक संपत्ति भी है।

7

आप TextBlock's Inlines property के माध्यम से सामने आने वाली इनलाइनों के संग्रह को संशोधित कर सकते हैं।

TextBlock tb = new TextBlock 
       { 
        Text = "This is some Green text up front.", 
        Foreground = Brushes.Green 
       }; 

InlineCollection tbInlines = tb.Inlines; 

tbInlines.Add(new Run 
       { 
       Text = "This is some Blue text.", 
       TextWrapping = TextWrapping.Wrap, 
       Foreground = Brushes.Blue 
       }); 

tbInlines.Add(new Run 
       { 
       Text = "This is some Green text following the Blue text." 
       }); 

Run hyperlinkRun = new Run("And finally, this is a Hyperlink."); 

tbInlines.Add(new Hyperlink(hyperlinkRun)); 

अपने संबंधित प्रश्नों के लिए के रूप में:: ऊपर XAML नमूना इस तरह एक छोटे से कुछ ऐसा दिखाई देगा

1 ए) हालांकि यह पर RequestNavigate घटना का उपयोग कर हर एक हाइपरलिंक उदाहरण के लिए एक ईवेंट हैंडलर हुक संभव है वर्ग, जो आवश्यक है उससे अधिक स्मृति स्थापित करने और उपयोग करने के लिए महंगा हो सकता है। इसके बजाय मैं अनुक्रमित घटनाओं का लाभ उठाने की सलाह देता हूं और केवल कंटेनर पर अनुरोध नाविगेट ईवेंट को जोड़ता हूं जहां आपके सभी हाइपरलिंक्स होंगे। यह एक तत्व सभी को एक साथ लिपटे होने की जरूरत है कि के रूप में आंतरिक TextBlock इलाज है अपने XAML उदाहरण में

myContainer.AddHandler(
        Hyperlink.RequestNavigateEvent, 
        new RequestNavigateEventHandler(
                 (sender, args) => 
                 { 
                 /* sender is the instance of the Hyperlink that was clicked here */ 
                 })); 

2 ए): तुम कितने तरह कर सकते हैं। यदि आप मेरे रन आधारित दृष्टिकोण का उपयोग कर रहे हैं तो रैपिंग को युक्त टेक्स्ट ब्लॉक से विरासत में प्राप्त किया जाना चाहिए।

+0

बहुत बहुत धन्यवाद। मैं एक डॉकपैन प्लस एकाधिक टेक्स्टब्लॉक का उपयोग कर रहा था, जिसमें सभी तरह के लपेटने के मुद्दे थे। मैंने एकाधिक रनों के साथ सिंगल टेक्स्टब्लॉक पर स्विच किया और कुछ जोड़ा हाइपरलिंक्स, और यह खूबसूरती से लपेट रहा है। मैं ट्रिगर करने के लिए HyperLink.RequestNavigateEvent प्राप्त करने के लिए अक्षम था। मैंने इसे हाइपरलिंक से कई स्थानों पर जोड़ने की कोशिश की, बिना किसी किस्मत के खिड़की तक। अभी के लिए, Hyperlink.Click चाल चल रहा है लगता है। कोई विचार? –

+0

अरे ड्रू, क्या आप जानते हैं कि xaml के माध्यम से डेटाबेसिंग के साथ ऐसा कैसे करें? तो आपको एन आइटम दिखाए जाते हैं जैसे कि आपने एक टेक्स्टब्लॉक के अंदर कई हाइपरलिंक्स को घोंसला दिया है। –