संपादित करें: मैंने एक अलग उत्तर में खोज की है कि TextBlock
में Inlines
संग्रह भी है जिसमें कोई भी Run
एस जोड़ सकता है। Anvaka's answer एक संलग्न कनवर्टर के रूप में एक संलग्न संपत्ति का सरलतापूर्वक उपयोग करता है।
मेरे पास इस दृष्टिकोण के बारे में कुछ विचार थे। केवल एक शब्द शब्द रैप को सही तरीके से संभाल लेगा और चरित्र को अलग-अलग फोंट के साथ चलाएगा।
FlowDocumentScrollViewer
का उपयोग करें और ValueConverter
का उपयोग करके स्ट्रिंग को बाध्य करें जो स्ट्रिंग को FlowDocument
में परिवर्तित करता है।
<FlowDocumentScrollViewer
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden"
Document="{Binding MyString, Converter={StaticResource MyConverter}}" />
आप नियमित रूप से फ़ॉन्ट गुण है, जो FlowDocumentScrollViewer
पर सेट नहीं किया जा सकता है और FlowDocument
कि कनवर्टर बनाता है पर स्थापित किया जाना है स्थापित करने के लिए कनवर्टर पर गुण बना सकते हैं। आपको शायद अपवाद सबस्ट्रिंग्स के लिए कुछ फ़ॉन्ट गुणों की भी आवश्यकता होगी जिन्हें एक अलग फ़ॉन्ट (और संभवतः अलग आकार) की आवश्यकता होती है। एक और विकल्प एस FlowDocument
पर उन गुणों (RelativeSource
) के लिए बनाना है।
और यहाँ कैसे आप कोड में एक FlowDocument
बनाने है:
FlowDocument doc = new FlowDocument();
doc.FontFamily = new FontFamily("Our Own Font");
Paragraph par = new Paragraph();
doc.Blocks.Add(par);
तो फिर तुम उन सबस्ट्रिंग बरकरार रखते हुए विशेष सबस्ट्रिंग पर भेजे स्ट्रिंग को विभाजित करने की आवश्यकता होगी। आपको अपना खुद का स्प्लिटर रोल करना होगा और कनवर्टर में सबस्ट्रिंग का संग्रह करना होगा या कनवर्टर को आपूर्ति करना होगा।
अनुच्छेद पर एक सामान्य-स्ट्रिंग जोड़ें:
Run r = new Run(substring);
par.Inlines.Add(r);
एक अलग फ़ॉन्ट के साथ पैरा के लिए एक विशेष स्ट्रिंग जोड़ें:
Run r = new Run(substring);
r.FontFamily = new FontFamily("Arial");
par.Inlines.Add(r);
ऊपर बस थोड़ा के टुकड़े कर रहे हैं। मुझे नहीं पता कि आप स्ट्रिंग को विभाजित करना चाहते हैं या सबस्ट्रिंग्स पर पुनरावृत्ति करना चाहते हैं क्योंकि मैं डेटा से परिचित नहीं हूं, इसलिए मैंने यह देखने के लिए कि क्या मेरा विचार काम करेगा या नहीं, मैंने विधि को एक साथ थप्पड़ मार दिया था। आप एक सबस्ट्रिंग का पता लगाने और आउटपुट में प्रतिस्थापन का उपयोग करने के लिए Dictionary
का उपयोग भी कर सकते हैं, जैसे "(SM)"
का पता लगाने और इसे "℠"
के साथ बदलना।
मुझे बताएं कि क्या आपके कोई प्रश्न हैं या यदि कुछ भी है तो मैं विस्तार कर सकता हूं।
(यह अच्छी बात है कि आप ने कहा कि यह केवल पढ़ने के लिए। एक RichTextBox
क्योंकि इसके Document
संपत्ति एक DependencyProperty
एक Binding
का लक्ष्य नहीं हो सकता है नहीं है और इसलिए काम नहीं होगा। हालांकि, एक Mode=OneWayToSource
उपयोग करने के लिए सक्षम हो सकता है यह उल्टा करने के लिए, Convert
के बजाय ConvertBack
को लागू करने।)
"मैं क्या तुम बाहर (बाएं स्ट्रिंग से अधिक पुनरावृत्ति और उन रन बनाने) मुश्किल हिस्सा है लगता है।"
मैं विशेष सबस्ट्रिंग्स पर स्ट्रिंग को विभाजित करने के बारे में वास्तव में बहुत संक्षिप्त था। जब मैंने कहा, "मुझे नहीं पता कि आप स्ट्रिंग को कैसे विभाजित करेंगे," मैं यह नहीं कह रहा था कि मुझे यह नहीं पता था कि इसे कैसे करना है (मैंने इसे दोहराया), लेकिन मुझे नहीं पता था कि आप कैसे चाहते हैं इसे संभालने के लिए। मुझे लगता है कि आपके लिए उस भाग को समझना मुश्किल नहीं होगा क्योंकि यह स्ट्रिंग मैनिपुलेशन समस्या का प्रकार है, जिसकी संभावित क्षमता है। वह, और आप अपने डेटा के बीच किनारे के मामलों की खोज कर सकते हैं जिसके लिए आप इसे कैसे संभालेंगे में परिवर्तन की आवश्यकता होती है।
मैं आपको IndexOf()
और Substring()
का उपयोग करके अपेक्षाकृत क्रूड संस्करण का वर्णन करूंगा।
तो यहां समस्या के भीतर समस्या है: आपके पास कई तार हैं (उदा।, "Company Name(R), makers of Product(TM)"
) जिसमें 0 या अधिक विशेष सबस्ट्रिंग शामिल हैं। ये सबस्ट्रिंग कुछ और ज्ञात हैं, और इनपुट स्ट्रिंग को कई तारों में विभाजित करने की आवश्यकता है जहां विशेष और गैर-विशिष्ट सबस्ट्रिंग एक-दूसरे से पृथक हो गए हैं (उदा।, {"Company Name", "(R)", ", makers of Product", "(TM)"}
)।
विशेष सबस्ट्रिंग कुछ और ज्ञात हैं, इसलिए आपको उनमें से एक सरणी की आवश्यकता है। आप .IndexOf()
के वापसी मूल्य से जानते हैं कि क्या इसे एक सबस्ट्रिंग मिला है या नहीं। ज्ञात विशेष सबस्ट्रिंग्स पर लूपिंग, आप इंडेक्स तुलना के साथ उनमें से किसी का भी पहला उदाहरण पा सकते हैं, सबस्ट्रिंग की लंबाई को अलग कर सकते हैं।
हर बार जब आप स्ट्रिंग S
(यदि हो तो) में जल्द से जल्द विशेष सबस्ट्रिंग मिल जाए, आप तार A
, B
, और C
ली गई है। B
विशेष सबस्ट्रिंग है, A
और C
पहले और बाद में हैं। A
और B
को List
और C
में नया S
बनें और आप इसे फिर से करें। सिवाय जब आपको S
में कोई विशेष सबस्ट्रिंग नहीं मिलती है और यह खाली नहीं है, इस मामले में आप इसे पूरी तरह से जोड़ते हैं।
अब List
में प्रत्येक विषम अनुक्रमित स्ट्रिंग एक विशेष सबस्ट्रिंग है। जब आप पाए गए सबस्ट्रिंग "(SM)"
पर "℠"
के Run
जोड़ने के लिए लुकअप के रूप में उपयोग के लिए इस उत्तर के पिछले भाग में Dictionary
के मेरे संदर्भ का उल्लेख करना चाह सकते हैं।
क्या आप हमें इस फ़ॉन्ट (नाम? घर या वाणिज्यिक?) के बारे में और बता सकते हैं और आप एक अलग फ़ॉन्ट का उपयोग क्यों नहीं कर सकते? –
यह एक कस्टम इन-हाउस फ़ॉन्ट है; एक अलग उपयोग नहीं कर सकते क्योंकि इसे लंबी अनुमोदन प्रक्रिया के माध्यम से जाना होगा। ग्राहक बहुत बड़ा है, और मुझे लगता है कि हमें यह भी ट्रैक करने में परेशानी होगी कि इसे किसने बनाया है। – SergioL