2010-12-10 9 views
6

यह प्रतिपादन एक बहुत ही सरल निर्माण के बारे में एक सवाल है - मैं निम्नलिखित XAML है:TextBlock एक Viewbox अंदर - अजीब

<Viewbox Height="100" Stretch="Uniform"> 
     <TextBlock FontFamily="Georgia">My Cool Text</TextBlock> 
    </Viewbox> 

यह काफी समझने के लिए सरल है। फिर भी जब मैं प्रोग्राम शुरू करता हूं तो मुझे अजीब धुंधला पाठ मिलता है (मेरे प्रोजेक्ट में कहीं भी बिटमैप प्रभाव नहीं होते हैं)। alt text

(बाईं ओर - VS2010 में डिजाइनर देखने के लिए, सही पक्ष - चल रहे एप्लिकेशन)

किसी को भी इस क्यों हो रहा है के बारे में किसी भी सुझाव हैं ??

+0

मेरी मशीन पर सही दिखता है –

+0

मेरी मशीन पर भी अच्छा लगता है !! आप किस डब्ल्यूपीएफ का उपयोग कर रहे हैं? क्या आप इसे एक नई विंडो पर जांच सकते हैं क्योंकि यह केवल सामग्री है? – decyclone

+0

हां, यह अच्छा लगता है अगर मैं एक नया ऐप बनाता हूं जिसमें केवल यह कोड शामिल है। मुझे पता है कि :) समस्या यह है कि मुझे नहीं पता कि मुझे इस धुंधली खींचने के लिए कैसे मिला। कहीं कुछ है और मुझे नहीं पता कि किसके साथ शुरुआत करना है। पूरे कोड/संसाधन डिक्ट्स को पोस्ट करना भी सबसे अच्छा विचार नहीं है - बहुत अधिक है। – Jefim

उत्तर

27

जबकि जेफिम ने अपने स्वयं के प्रश्न का सही उत्तर दिया है, मैं यह बताना चाहता हूं कि इस विशेष सेट का उपयोग करते समय आपको यह व्यवहार क्यों मिलता है। जेफिम सुझाव देता है कि यह डब्ल्यूपीएफ में एक बग है, लेकिन ऐसा नहीं है। WPF को कुछ असंभव करने के लिए पूछने के परिणामस्वरूप समस्या उत्पन्न होती है। जब आप इस असंभव चीज के लिए पूछते हैं तो इसे एक समझौता करना पड़ता है, और नतीजा यह है कि आप ऊपर क्या देखते हैं।

स्पष्टीकरण एक टिप्पणी के लिए थोड़ा लंबा है, इसलिए मैं इसे एक अलग उत्तर में डाल रहा हूं।

यह उदाहरण WPF की दो पारस्परिक विरोधाभासी विशेषताओं का उपयोग करता है। उन विशेषताएं हैं:

  1. किसी भी पैमाने
  2. उसी तरह GDI32 में पाठ प्रस्तुत करना करने की क्षमता में लगातार दृश्यों रेंडर करने के लिए क्षमता पाठ

आप एक बार में दोनों सुविधाओं का उपयोग नहीं कर सकते हैं बना देता है। जीडीआई 32 इस तरह से टेक्स्ट को प्रस्तुत करता है जिसे निरंतर स्केल नहीं किया जा सकता है: यदि किसी निश्चित फ़ॉन्ट आकार पर टेक्स्ट का एक विशेष टुकड़ा 200 पिक्सल चौड़ा होता है, तो यदि आप फ़ॉन्ट आकार को 3 से गुणा करते हैं, और उसी टेक्स्ट को उसी फ़ॉन्ट परिवार में प्रस्तुत करते हैं जीडीआई 32 में यह नया फ़ॉन्ट आकार शायद 600 पिक्सेल नहीं होगा - यह करीब होगा, लेकिन यह आमतौर पर बिल्कुल सही नहीं होगा।

जीडीआई 32 पाठ की स्पष्टता और तीखेपन को बढ़ाने के लिए अक्षरों के आकार और चौड़ाई के साथ गड़बड़ करता है। विशेष रूप से, यह आकार से बाहर अक्षरों को झुकता है ताकि उनकी विशेषताएं आपकी स्क्रीन पर पिक्सेल के साथ बेहतर संरेखित हों। और जहां आवश्यक हो, यह पिक्सेल चौड़े की सटीक संख्या के लिए अलग-अलग वर्णों की चौड़ाई समायोजित करेगा। चूंकि यह पत्र झुकाव सभी वास्तविक पिक्सेल के आसपास आधारित है, इसलिए यह विभिन्न फ़ॉन्ट आकारों पर पाठ को अलग-अलग तरीकों से झुकता है।

जबकि यह आपको अच्छा तेज दिखने वाला टेक्स्ट देता है, तो आप धीरे-धीरे पैमाने को बदलने की कोशिश करते हैं तो यह बिल्कुल भयानक लग रहा है। यदि आप इस फैशन में दिए गए कुछ पाठ के फ़ॉन्ट आकार को एनिमेट करने का प्रयास करते हैं, तो चीज चमकदार और कड़वाहट लगती है, क्योंकि स्पष्टता के नाम पर किए गए समायोजन प्रत्येक फ़ॉन्ट आकार पर थोड़ा अलग होते हैं।भले ही आप एनिमेट नहीं कर रहे हों, फिर भी यह खराब परिणाम उत्पन्न कर सकता है - यदि आपके पास कई आकारों पर दिखाया गया एक एकल टाइपफ़ास है, तो यह प्रत्येक आकार पर काफी अलग दिख सकता है; यदि आपके एप्लिकेशन में ज़ूम सुविधा है, तो टेक्स्ट ज़ूम इन और ज़ूम आउट होने पर महत्वपूर्ण रूप से बदल सकता है। (और इसलिए लेआउट भी हो सकता है। यदि आप माइक्रोसॉफ्ट वर्ड का उपयोग करते हैं, तो आपने देखा होगा कि आप कभी-कभी कुछ शब्दों के बीच अजीब दिखने वाले अतिरिक्त चौड़े स्थान प्राप्त करते हैं। यह जीडीआई 32 के साथ शब्द लड़ने का परिणाम है - शब्द ऑन-स्क्रीन लेआउट रखने का प्रयास करता है प्रिंटिंग के दौरान चीजें कैसे दिखाई देगी, इसका मतलब है कि इसका मतलब है कि कभी-कभी जीडीआई 32 के ग्रिड फिटिंग के साथ संघर्ष होता है।)

तो डब्ल्यूपीएफ टेक्स्ट प्रतिपादन के लिए एक अलग दृष्टिकोण प्रदान करता है: यह पाठ को ऐसे तरीके से प्रस्तुत कर सकता है जो जितना संभव हो उतना वफादार हो फ़ॉन्ट के मूल डिजाइन के लिए। यह पाठ को कम विकृत करता है, और इसका मतलब है कि आप स्केल करते समय असंतोष नहीं प्राप्त करते हैं।

नकारात्मकता यह है कि टेक्स्ट को धुंधला लग रहा है, जीडीआई 32 द्वारा प्रस्तुत पाठ की तुलना में। (जीडीआई 32 द्वारा किए गए विकृतियों का उद्देश्य स्पष्टता में सुधार करना है।)

तो डब्ल्यूपीएफ 4.0 में, माइक्रोसॉफ्ट ने जीडीआई 32 के तरीके में टेक्स्ट प्रस्तुत करने की क्षमता को जोड़ा। यही TextOptions.TextFormattingMode="Display" करता है।

उस विकल्प को चालू करके, आप कह रहे हैं "मुझे लगातार स्केलिंग की आवश्यकता नहीं है, और मैं स्पष्टता पसंद करूंगा, इसलिए जीडीआई 32 में आपके द्वारा किए गए वही पिक्सल उत्पन्न करें।" यदि आप स्केलिंग लागू करने के लिए आगे बढ़ते हैं, तो डब्ल्यूपीएफ को बताया गया है कि आपको स्केलेबिलिटी की आवश्यकता नहीं है, तो आपको क्रैपी परिणाम मिलते हैं। डब्ल्यूपीएफ ने सावधानीपूर्वक पाठ के बिटमैप को आपके विनिर्देशों के लिए प्रस्तुत किया, और फिर आपने इसे उस पाठ को एक अलग पैमाने पर प्रस्तुत करने के लिए कहा। और ऐसा लगता है कि यह क्या है: एक अलग संकल्प के लिए उत्पन्न कुछ पाठ का एक स्केल्ड बिटमैप।

आप तर्क दे सकते हैं कि डब्ल्यूपीएफ कुछ अलग कर सकता है: यदि आप जीडीआई 32 में स्केल ट्रांसफॉर्म लागू करते हैं तो आपको अलग-अलग व्यवहार दिखाई देंगे - आप पहले वर्णित विभिन्न पैमाने पर असंगतता देखेंगे। यदि आप वास्तव में डब्ल्यूपीएफ में उस प्रभाव को चाहते हैं तो आप सीधे फ़ॉन्ट आकार को संशोधित करके प्राप्त कर सकते हैं। लेकिन डब्ल्यूपीएफ उसी प्रभाव को प्राथमिकता देने से प्राथमिकता नहीं देता है - इसके लक्ष्यों को जीडीआई 32-स्टाइल कुरकुरा पाठ प्राप्त करना संभव होता है जब आपको वास्तव में इसकी आवश्यकता होती है, और डिफ़ॉल्ट रूप से लगातार स्केलिंग प्रदान करना होता है।

और आप यहां क्या चल रहे हैं वह "लगातार स्केलिंग" है। जीडीआई 32-स्टाइल टेक्स्ट प्रतिपादन को चालू करने से लगातार स्केलिंग नहीं होती है: एक स्केल फैक्टर (या तो सीधे, ScaleTransform या अप्रत्यक्ष रूप से Viewbox के माध्यम से) को लागू करना, दृश्य के आयामों को बिल्कुल निर्दिष्ट स्केल कारक से बदल देगा। यदि यह नए स्केल किए गए आकार में ग्रिड फिटिंग द्वारा टेक्स्ट विज़ुअल को पुन: उत्पन्न करना था, तो पाठ एक अलग चौड़ाई पर बाहर आ जाएगा। इससे वास्तव में Viewbox समस्याएं उत्पन्न हो सकती हैं: यह सामग्री के प्राकृतिक आकार के आधार पर एक स्केल कारक लागू करती है, जिसे इसे उपलब्ध स्थान में फिट करने के लिए डिज़ाइन किया गया है। लेकिन अगर यह स्केलिंग के बाद ग्रिड फिट फिर से किया, तो वह वास्तव में चौड़ाई बदल जाएगा। जीडीआई 32 पाठ प्रतिपादन कैसे काम करता है, इस बारे में अंतर्निहित असंगतताओं के कारण, ViewBox के लिए उपयुक्त पैमाने खोजने के लिए भी संभव नहीं हो सकता है - पाठ के एक टुकड़े के साथ आना संभव है, जब किसी विशेष फ़ॉन्ट में प्रस्तुत किया जाता है, कभी बाहर नहीं आएगा 200 पिक्सल चौड़े पर। कुछ फ़ॉन्ट आकारों के लिए, ग्रिड फिटिंग में अंतर्निहित गोलाकार आकार को नीचे गिर सकता है, कह सकता है, 1 9 83, और यह उस पर टिक सकता है क्योंकि आप फ़ॉन्ट आकार में छोटे वेतन वृद्धि करते हैं, जब तक कि आप कुछ सीमा से आगे नहीं जाते, उस बिंदु पर यह कूद सकता है 202 पिक्सल तक।

Viewbox के लिए पाठ को 200 पिक्सल में फ़िट करने के लिए मजबूर करने का प्रयास करने के लिए, यह एक समस्या होगी। लेकिन Viewbox इस तरह से काम नहीं करता है - यह डब्ल्यूपीएफ के लगातार स्केलिंग का उपयोग करता है, जिस बिंदु पर आपने फ़ॉन्ट आकार चुना है, जिसमें जीडीआई 32-शैली टेक्स्ट प्रतिपादन काम कर रहा है। तो Viewbox हमेशा ऐसा करने में सक्षम होगा जो इसे करने के लिए डिज़ाइन किया गया है, लेकिन यह वह कार्य है जो मूल रूप से जीडीआई 32-शैली टेक्स्ट प्रतिपादन के साथ असंगत है।

तो संक्षेप में, डब्ल्यूपीएफ आपके द्वारा अनुरोध किए गए फ़ॉन्ट आकार के लिए पाठ प्रस्तुत करता है, और उसके परिणामस्वरूप स्केल करता है।

तो आपको केवल एक सुविधा चुननी है - आपके पास दोनों नहीं हो सकते क्योंकि यह बस असंभव है। या तो किसी संदर्भ में पाठ प्रस्तुत करने का प्रयास न करें जिसमें एक मनमाना पैमाने कारक लागू किया जा सकता है (उदा। Viewbox) या GDI32-style टेक्स्ट प्रतिपादन चालू न करें। अन्यथा, आपको वह अजीब पिक्सलेटेड टेक्स्ट मिलता है जिसे आपने सामना किया है।

+0

इस "टिप्पणी" के लिए धन्यवाद - यह पढ़ने के लिए काफी दिलचस्प है। मैं इसे उत्तर के रूप में चिह्नित कर रहा हूं क्योंकि यह सिर्फ इसके लायक है। एक "बग" के निर्माण के लिए - आपके स्पष्टीकरण ने मेरे लिए कुछ चीजों को मंजूरी दे दी है। अब मैं केवल यह कहने जा रहा हूं - यह एमएसडीएन दस्तावेज़ों पर होना चाहिए। वास्तव में, क्योंकि यह इतना स्पष्ट नहीं है (मेरे लिए कम से कम) और मुझे समस्या के कारण होने से पहले कुछ घंटे बिताना पड़ा। वैसे भी, उत्तर के लिए फिर से धन्यवाद। – Jefim

+0

@lan Griffiths thx, मैं जानना चाहता हूं कि क्या मैं तत्व प्राप्त कर सकता हूं जो देखने में बॉक्स ने इसे वास्तविक आकार बदल दिया है? वास्तविक आकार वास्तविक स्क्रीन नहीं है स्क्रीन में तत्व शो है। और मैं http://stackoverflow.com/questions/42411455/how-to-now-the-element-actual-size-have-change-by-other-control?noredirect में पोस्ट करता हूं – lindexi

8

ठीक है, बग मिला। अगर मैं इसे वापस "आदर्श" (जो डिफ़ॉल्ट मान है) करने के लिए सेट तो इसे सही ढंग से viewbox के अंदर का पाठ renders

<Setter Property="TextOptions.TextFormattingMode" Value="Display"/> 

: मेरी खिड़की शैली का अनुसरण सेटर है। मैं कहूंगा कि यह डब्ल्यूपीएफ के अंदर एक बग है। मूल रूप से, आप इस कोशिश करता है, तो:

<Viewbox Height="100" Stretch="Uniform" TextOptions.TextFormattingMode="Display"> 
    <TextBlock FontFamily="Georgia">My Cool Text</TextBlock> 
</Viewbox> 

तुम मेरी प्रारंभिक चित्र में के रूप में एक ही परिणाम प्राप्त करेंगे।

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