2010-01-28 8 views
6

हमारे पास एक WPF एप्लिकेशन है जो विभिन्न कॉर्पोरेट प्रतीकों वाले टेक्स्ट प्रदर्शित करता है; जैसे कि ट्रेडमार्क, पंजीकृत ट्रेडमार्क, कॉपीराइट और सेवा चिह्न।फ़ॉन्ट, ट्रेडमार्क, सेवा चिह्न इत्यादि को WPF टेक्स्टबॉक्स में कैसे सम्मिलित करें जब फ़ॉन्ट प्रतीकों का समर्थन नहीं करता

डेटाबेस में कुछ फ़ील्ड हैं जिनमें मानक कॉर्पोरेट प्रतीक शामिल हैं। प्रारंभ में, डेटा इस प्रकार के रूप में चिह्नित किया गया था:

Example Corp(TM) or Example Plan (SM)

हम आसानी से अपने-अपने यूनिकोड समकक्ष प्लेसहोल्डर बदल सकते हैं; और वास्तव में ज्यादातर मामलों में है।

हमारे पास समस्या यह है कि एप्लिकेशन द्वारा उपयोग किया जाने वाला फ़ॉन्ट सेवा मार्क प्रतीक का समर्थन नहीं करता है (जो केवल एक सुपरस्क्रिप्ट एसएम है)। संभावना है कि हम फ़ॉन्ट को प्रतिस्थापित नहीं कर सकते हैं या इसे संपादित नहीं कर सकते हैं।

फ़ील्ड अंत में प्रतीक के साथ एक साधारण उत्पाद नाम हो सकता है, या प्रतीक के साथ एक लंबा विवरण 0 या अधिक बार होता है। हम टेक्स्टबॉक्स या लेबल्स को सीधे व्यूमोडेल और/या व्यावसायिक ऑब्जेक्ट (आमतौर पर डेटा टेम्पलेट्स के माध्यम से) से जोड़ते हैं। एप्लिकेशन में सभी डेटा केवल पढ़ने के लिए है।

तो, मान लीजिए कि हमें कोड (सी # और डब्ल्यूपीएफ में) के माध्यम से इसका सामना करना है, मेरे विकल्प क्या हैं?

+0

क्या आप हमें इस फ़ॉन्ट (नाम? घर या वाणिज्यिक?) के बारे में और बता सकते हैं और आप एक अलग फ़ॉन्ट का उपयोग क्यों नहीं कर सकते? –

+0

यह एक कस्टम इन-हाउस फ़ॉन्ट है; एक अलग उपयोग नहीं कर सकते क्योंकि इसे लंबी अनुमोदन प्रक्रिया के माध्यम से जाना होगा। ग्राहक बहुत बड़ा है, और मुझे लगता है कि हमें यह भी ट्रैक करने में परेशानी होगी कि इसे किसने बनाया है। – SergioL

उत्तर

4

संपादित करें: मैंने एक अलग उत्तर में खोज की है कि 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 के मेरे संदर्भ का उल्लेख करना चाह सकते हैं।

+0

पाठ तत्वों को पाठ को तोड़ना शायद जाने का तरीका है; हालांकि, यह समाधान का एकमात्र हिस्सा है। मुझे लगता है कि आपने जो छोड़ा था (स्ट्रिंग पर फिर से चलना और उन रनों को बनाना) मुश्किल हिस्सा है। – SergioL

+0

मैं इसे सही उत्तर के रूप में चिह्नित करने जा रहा हूं, भले ही मैं कुछ और अधिक सुरुचिपूर्ण चीज़ की उम्मीद कर रहा था। वास्तविकता में, यह अंवाका के उत्तर और ब्रूट-फोर्स स्ट्रिंग मैनिपुलेशन का संयोजन था जिसे मैंने कार्यान्वित किया। – SergioL

+0

मेरे लिए अच्छा लगता है। अलग-अलग तारों को चुनना हमेशा मेरी राय में, सुरुचिपूर्ण है। केवल एक चीज जो इसे साफ करेगी - जटिलता को एक स्थान से दूसरे स्थान पर स्थानांतरित करके - रेगेक्स के साथ स्ट्रिंग को अलग करना होगा। –

1

यदि आपका प्रदर्शन तत्व RichTextbox नियंत्रण जैसे एकाधिक फ़ॉन्ट्स का समर्थन करता है, तो आप स्ट्रिंग को केवल (टीएम) और (एसएम) प्रतीकों के आस-पास उचित फोंट के साथ प्रारूपित कर सकते हैं।

+0

मुझे लगता है कि आपने अभी समस्या को पुनर्स्थापित कर दिया है। – SergioL

0

ऐसा करने के लिए कुछ हद तक बदसूरत तरीका है, लेकिन एक विकल्प संभवतः उचित स्थानों में पूर्व-प्रस्तुत प्रतीक वाली छोटी छवियों को रखने के लिए हो सकता है। चूंकि डेटा स्थैतिक नहीं है (यदि मैं सही ढंग से समझता हूं), तो आपको छवियों के लिए गतिशील रूप से स्थिति की गणना करने की आवश्यकता होगी, जो तब तक मुश्किल होगा जब तक कि फ़ॉन्ट निश्चित-चौड़ाई न हो।

संबंधित मुद्दे