2012-03-28 5 views
10

मैं एमएसडीएन में इस UpdateLayout() method के बारे में पढ़ रहा था।मुझे एक उदाहरण दे सकता है कि UIElement.UpdateLayout() का उपयोग कब करना चाहिए?

इसे कहते हैं:

सुनिश्चित करता है कि इस तत्व की सभी दृश्य बच्चे तत्व पूरी तरह हैं लेआउट के लिए अद्यतन किया गया।

लेकिन मुझे समझ नहीं आता क्या लेआउट का क्या मतलब है ठीक से नहीं अद्यतन किया गया।

मैं एक साल से अधिक के लिए सिल्वरलाइट/डब्ल्यूपीएफ के साथ काम कर रहा हूं, लेकिन मैंने अभी भी इस विधि का उपयोग नहीं किया है।

तो क्या कोई मुझे ऐसा उदाहरण दे सकता है जिसके लिए इस विधि का उपयोग करने की आवश्यकता होगी? तो मैं वास्तव में समझ सकता हूं कि यह क्या करता है और जब मुझे इसका उपयोग करना चाहिए?

उत्तर

8

यदि आपको आवश्यकता हो तो आप इसे कॉल करना चाहेंगे अपने लेआउट को तुरंत पूरा करने के लिए नियंत्रण ताकि आप उस पर आधारित कुछ कर सकें।उदाहरण के लिए, आप बच्चे के नियंत्रण पर UpdateLayout पर कॉल कर सकते हैं ताकि इसे ActualHeight और ActualWidth मिल जाए, यदि आप उस पर आधारित कुछ और करना चाहते हैं (जैसे इसे स्थिति दें, या इसी आकार के साथ कुछ खींचें)।

+2

ओह वाह, जैसा कि आपने कहा था कि यह वास्तव में काम करता है! मैंने एक ग्रिड और एक बटन गतिशील रूप से बनाने की कोशिश की। ग्रिड में जोड़े जाने के बाद बटन 'ActualHeight/ActualWidth' में केवल' 0.00' है, लेकिन एक बार जब मैं 'अपडेटलाउट' निष्पादित करता हूं तो यह मुझे वास्तविक मान देता है! अब मैं देखता हूं कि मैं किसके लिए उपयोग कर सकता हूं, धन्यवाद! +1 –

+2

+1 बिल्कुल जो मैं देख रहा था; UpdateLayout() पर कॉल करने के बाद, ActualWidth उपलब्ध हो गया। – Sabuncu

+0

आज एक और परिदृश्य मैंने सामना किया। कस्टम कम्बोबॉक्स के लिए 'ऑनड्रॉपडाउन ओपेन' में मुझे 'ItemContainerGenerator.ContainerFromItem' को कॉल करने की आवश्यकता थी, लेकिन यह पहली कॉल के लिए शून्य हो गई, और बाद में 'ऑनड्रॉपडाउन ओपन' कॉल में ठीक काम किया। मुझे 'ContainerFromItem' को कॉल करने से पहले UpdateLayout() जोड़ना पड़ा, और फिर उसने पहली कॉल के लिए भी काम करना शुरू कर दिया। मुझे पता है कि वैकल्पिक समाधान 'वर्चुअलाइजिंगस्टैक पैनेल' का उपयोग करके वर्चुअलाइजिंग को बंद करना होगा, लेकिन मैं प्रदर्शन कारणों से ऐसा नहीं करना चाहता था। – JustAMartin

0

मुझे लगता है कि निर्माण नियंत्रण करते समय सबसे अधिक उपयोग किया जाता है। उदाहरण के लिए: यदि कोड में आपको लगता है कि एक नया नियंत्रण जोड़ा गया है या कुछ विशेष रूप से हुआ है तो आप नियंत्रण के पुनः लेआउट को मजबूर करने के लिए इस अद्यतनLayout() को कॉल कर सकते हैं। कुछ मामलों में डब्ल्यूपीएफ यह मान सकता है कि यूआई पर्याप्त बदलता है, इसलिए यह आपके नियंत्रण के अपडेटलेआउट() को कॉल करता है। हम सभी गलतियां करते हैं ... यदि आपको कोई नियंत्रण मिलता है जिसे अपने बच्चों को "फिर से" या "पुनर्व्यवस्थित" करना चाहिए, तो आप इसे "अपडेटलाइट" कहकर "ताज़ा करें" करने के लिए मजबूर करने का प्रयास कर सकते हैं।

3

मेरे शोध से, UpdateLayout अद्यतन करने के लिए लेआउट पर सभी नियंत्रण प्राप्त करने के लिए एक बहुत ही शक्तिशाली तरीका प्रतीत होता है। हालांकि, ज्यादातर मामलों में, लेआउट सिस्टम पर्याप्त स्मार्ट और अपने आप पर उचित रूप से अपडेट करने के लिए पर्याप्त तेज़ है। जो कुछ भी मैंने पढ़ा है, वह मुझे विश्वास दिलाता है कि यह कॉल केवल तभी जरूरी है जब आप बहुत सारे लेआउट संशोधन (नियंत्रण जोड़ रहे हैं और उन्हें चारों ओर ले जा रहे हैं) कर रहे हैं और आपको एक विशेष लेआउट परिदृश्य को प्रदर्शित करने की आवश्यकता है जबकि बाकी अपडेट स्टैक है पूरा हो गया (हालांकि मुझे अभी भी इसे प्रदर्शित करने के लिए एक अच्छा उदाहरण देखना है ... सामान्य लेआउट एल्गोरिदम बस इतना अच्छा लगता है)। This MSDN article on layout चीजों को स्पष्ट करने में मदद करनी चाहिए।

हालांकि, ऊपर से:

UpdateLayout विधि एक पुनरावर्ती लेआउट अद्यतन मजबूर करता है, और अक्सर आवश्यक InvalidateArrange को

और this documentation

लगातार कॉल नहीं है, या विशेष रूप से UpdateLayout के लिए, में बड़ी संख्या में महत्वपूर्ण प्रदर्शन परिणाम हैं यूआई में तत्व मौजूद हैं। इस विधि को कॉल करने से बचें जबतक कि आप को में अन्य एपीआई के बाद के कॉल के लिए सटीक लेआउट स्थिति की आवश्यकता नहीं है।

सीधे आपके प्रश्न का उत्तर देने के लिए निष्कर्ष में। यह ज्यादातर आंतरिक यूआई लेआउट तर्क के साथ अपने आप पर किया जाता है, और आपको शायद इसका उपयोग करने की आवश्यकता नहीं होगी। उपरोक्त तक, मुझे ऐसा लगता है कि जब आपको इसका उपयोग करने की आवश्यकता होती है तो यह बहुत स्पष्ट होगा (और यह मेरे विचारों सहित कई लोगों को थ्रेड करने के लिए नहीं है)

+0

एचएम ... मैं अभी भी आपके उदाहरण से नहीं समझता हूं। मैंने आपके कोड की कोशिश की और UI थ्रेड से पहले UpdateLayout() को कॉल करने के बाद अपडेट नहीं होगा। नींद(), इसने विधि को कॉल करने से कोई फर्क नहीं पड़ता। –

+0

@ किंग्सहान मैंने अपना जवाब पूरी तरह अद्यतन किया है। बहुत से शोध के बाद, ऐसा प्रतीत होता है कि यह क्या प्रतीत होता है और यहां तक ​​कि जो कुछ भी मानता है वह गलत है। यह मुख्य रूप से पूरे कैनवास को अपडेट करने के लिए एक विधि है ... लेकिन इसकी लगभग आवश्यकता नहीं है। –

+0

आपके शोध के लिए thansk, तो अब मुझे पता है कि वास्तव में काफी सामान्य है कि हमें लेआउट को ठीक करने के लिए उस विधि की आवश्यकता नहीं है। धन्यवाद। +1 –

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