2012-12-19 10 views
5

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

निम्नलिखित तस्वीर पर विचार करें। बच्चा 100x50 है लेकिन दृश्य क्षेत्र बाल समन्वय में (10,5) और (100,50) पर कोनों के साथ एक आयताकार है। वह क्षेत्र है जिसे हम ढूंढ रहे हैं।

Clipped Child

ध्यान दें: आप नहीं बस कतरन क्योंकि यह पैरेंट कि कतरन कर रहा है नहीं हो सकता है के लिए माता पिता और परीक्षण करने के लिए बच्चे से होने वाले रूपांतरण समन्वय कर सकते हैं।

स्क्रॉलव्यूअर के अंदर नेस्टेड कैनवास नियंत्रण पर विचार करें। आंतरिक कैनवास बाहरी कैनवास की सीमाओं के भीतर पूरी तरह से पूरी तरह से रख सकता है, लेकिन बाहरी कैनवास को स्क्रॉलव्यूयर द्वारा क्लिप किया जा सकता है, इस प्रकार आंतरिक कैनवास भी इसके द्वारा चिपकाया जाता है।

दृश्य पेड़ पर चलना और प्रत्येक माता-पिता का परीक्षण करना प्रदर्शन को मार देगा।

तो क्या डब्ल्यूपीएफ में कुछ भी बनाया गया है जो नियंत्रण के दृश्य क्षेत्र की सीमाएं प्राप्त कर सकता है?

+0

यह धागा मदद कर सकता है आप क्या चाहते: http://stackoverflow.com/questions/1517743/in-wpf-how-can-i-determine-whether-a-control-is-visible उपयोगकर्ता के लिए –

+0

नहीं! यह सिर्फ सीमा-जांच है (ऊपर मेरा 'नोट' देखें।) यह वास्तव में दिखाई नहीं देता है कि क्या दिखाई दे रहा है। – MarqueIV

+0

अंधेरे में बस एक स्टैब - IsMouseDirectlyOver संपत्ति के आंतरिक में देखने के लिए परावर्तक का उपयोग करें (अधिकांश WPF नियंत्रणों पर पाया गया है, शायद फ्रेमवर्क एलिमेंट से विरासत में मिला है)। यह संपत्ति निर्धारित करने के लिए नेस्टेड ऑब्जेक्ट्स के माध्यम से दिखती है कि माउस सीधे सटीक विशिष्ट नियंत्रण पर है या नहीं। मैं सोच रहा हूं कि आप सीमाओं की जांच के लिए समान तर्क का उपयोग करने में सक्षम हो सकते हैं ... – Marko

उत्तर

0

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

अपने दृश्य वस्तुओं के आसपास स्लाइड, या verticle आदेश (यानी, जेड आदेश) में के बारे में ले जाते हैं - वे बस दिखाई, या नहीं हो पाएगी। यदि आप जेड-ऑर्डर के भीतर अपनी स्थिति के बावजूद कुछ दिखाना नहीं चाहते हैं, तो आप इसे अदृश्य बनाते हैं (आदर्श रूप से, इसे उस संपत्ति पर बाध्य करके जो दृश्यता का मूल्यांकन करता है। दृश्यमान, दृश्यता। निषिद्ध, या दृश्यता। समाहित)।

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

+0

वे सभी महान अंक हैं, लेकिन वे लागू नहीं होते हैं। हम * बहुत सारे कस्टम प्रतिपादन कर रहे हैं जो कि सरल (या यहां तक ​​कि जटिल) बाइंडिंग का ख्याल नहीं रख सकता क्योंकि वे वास्तव में प्रतिपादन से पहले सैकड़ों गणनाएं कर सकते हैं।लेकिन उनका क्लिप क्षेत्र अन्य कारकों के आधार पर बदल सकता है, इसलिए हम उन चीजों को प्रस्तुत करने में बहुत समय व्यतीत कर रहे हैं जो कभी नहीं देखे जाते हैं। आप अनिवार्य रूप से एक अलग प्रश्न के वैकल्पिक समाधान का प्रस्ताव कर रहे हैं, मेरा नहीं। मेरा सवाल क्लिप क्षेत्र को निर्धारित करने का एक तरीका ढूंढना था। हालांकि आपके इनपुट के लिए धन्यवाद। मुझे यकीन है कि यह दूसरों की मदद कर सकता है। बस हमें नहीं। – MarqueIV

+0

और रिकॉर्ड के लिए, हाँ, मैं WPF में जानता हूं, जब तक कि आप कहने से बात नहीं कर रहे हैं, ऑनरेंडर कॉल में कोई भी 'प्रतिपादन' वास्तव में बिल्कुल प्रस्तुत नहीं होता है, बल्कि ड्राइंग निर्देशों को कैशिंग करता है जिसे बाद में निष्पादित किया जाता है हार्डवेयर को प्रतिपादन वास्तविक कॉल। इस सवाल के बिंदु के लिए, मान लीजिए कि हम एक लिखने योग्य बिटमैप का उपयोग कर रहे हैं जिसे हमें पूरी तरह से फिर से उत्पन्न करना होगा, इसलिए अगर कुछ वास्तव में दिखाई नहीं दे रहा है, तो हम उस हिस्से को अनुकूलित करना चाहते हैं। – MarqueIV

+0

ठीक है, मैं देखता हूं। इस प्रकार का अधिकांश क्यू अपेक्षाकृत नए से डब्ल्यूपीएफ या सरल परिदृश्यों के लिए है - स्पष्ट रूप से यहां मामला नहीं है। मैं एक सामान्य शॉर्टकट के बारे में नहीं जानता। मैंने 2 किया है जिसके लिए जटिल प्रतिपादन की भारी मात्रा की आवश्यकता होती है: एक में, सामग्री क्षैतिज (ग्राफ के स्क्रॉलिंग सेट) में स्लाइड करना था। तो मैंने WritableBitmaps को क्षैतिज रूप से ढेर स्ट्रिप्स के रूप में व्यवस्थित रूप से संगठित किया। चूंकि प्रत्येक पट्टी दृष्टि से बाहर बाईं ओर फिसल जाती है, इसे ऑफ-स्क्रीन के रूप में चिह्नित किया जाएगा, और वीज़ा-विपरीत जैसे स्ट्रिप्स दाईं ओर दिखाई देते हैं। यह पूरी तरह से ऐप की ज्यामितीय प्रकृति पर निर्भर करता है – JamesWHurst

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

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