2011-05-11 14 views
7

ठीक है, विंडोज़ फॉर्म में आप .refresh() का उपयोग किसी तत्व पर रेड्रो ईवेंट के कारण कर सकते हैं। क्या डब्ल्यूपीएफ में कोई समान समाधान है?डब्ल्यूपीएफ कैनवास के रेड्रो को मजबूर करना

मैं जो कर रहा हूं उसका एक स्पष्टीकरण, मैं कैनवास ऑब्जेक्ट पर एक भूलभुलैया खींच रहा हूं, और देखना चाहता हूं कि भूलभुलैया खींची गई है (इसलिए मैं प्रगति देख सकता हूं) 28 मिनट के समाधान के लिए अचानक प्रकट मैं Rectangle एस की श्रृंखला के साथ कैनवास पर ब्लॉक खींच रहा हूं। क्या रीफ्रेश आयताकार या कैनवास पर होना चाहिए? http://imgur.com/ftFOv

मैं सी # में एक समाधान चाहते हैं कि यदि संभव है:

यहाँ हाल ही में एक उत्पादन है। धन्यवाद।

उत्तर

7

शायद आप Dispatcher ऑब्जेक्ट का उपयोग करना चाहते हैं। मेरा सुझाव है कि आप इस शॉन वाइल्डर्मथ के आलेख को देखें: Build More Responsive Apps With The Dispatcher (एमएसडीएन पत्रिका अक्टूबर 2007)।

+9

यह 100% समाधान नहीं था, लेकिन यह मुझे सही दिशा में शुरू किया। आखिरकार यह क्या काम करता है: 'कैनवास। डिस्पैचर.इनवोक (खाली डिलीगेट, डिस्पैचर प्राइरिटी.रेंडर);' जहां खाली डिलीगेट है 'एक्शन रिक्त डिलीगेट = प्रतिनिधि {}; ' – ohmusama

+0

धन्यवाद, साइमन, जो आपने पहले किया था, उसके लिए धन्यवाद। मैं अब लेख पढ़ रहा हूँ। – philologon

+2

"डिस्पैचर के साथ अधिक उत्तरदायी ऐप्स बनाएं" का लिंक अब काम नहीं करता है। –

26

यह वही है आप स्पष्ट रूप से आप क्या कर रहे दिखाने के लिए ...

element.InvalidateVisual(); 
+0

यह अच्छी तरह से काम करता है, धन्यवाद @ एडम – J3soon

11

मेरे लिए यह काम देख रहे हैं ...

element.UpdateLayout(); 
2

एक अच्छा Minimal, Complete, and Verifiable code example बिना है, यह असंभव है यह सुनिश्चित करने के लिए कि यहां सबसे अच्छा जवाब क्या है। हालांकि, आपके विवरण से ऐसा लगता है कि भूलभुलैया उत्पन्न करने वाला एल्गोरिदम यूआई थ्रेड में निष्पादित कर रहा है, यूआई को खुद को अपडेट करने से रोक रहा है।

बस के रूप में Winforms, जहां लोगों Refresh() या Application.DoEvents(), यहाँ असली समस्या की तरह तरीकों कॉल करने के लिए आकर्षक हैं के साथ मामले में कि आप यूआई धागा अवरुद्ध कर रहे हैं है। सही इसे ठीक करने का तरीका है, ऐसा न करें।

बहुत सारे विकल्प हैं और बिना किसी विस्तृत प्रश्न के आपके पास यह जानने का कोई तरीका नहीं है कि आपके मामले में सबसे अच्छा तरीका क्या होगा। हालांकि, Progress<T> कक्षा के साथ संयोजन में BackgroundWorker, या Task.Run() का उपयोग करने के लिए सबसे अधिक उपयोग किए जाने वाले और सबसे अधिक उपयुक्त तकनीकों का उपयोग करना है। किसी भी मामले में, आपका एल्गोरिदम एक अलग धागे में चलता है, जो यूआई थ्रेड को समय-समय पर अपडेट पास करता है (उदाहरण के लिए प्रत्येक आयत, प्रत्येक दस आयताकार, जो भी हो)। यूआई थ्रेड को एक अपडेट प्राप्त होता है, दृश्यों को डेटा जोड़ता है, और फिर अगले अपडेट के लिए प्रतीक्षा करने के लिए वापस चला जाता है।

BackgroundWorker और Progress<T> दोनों यूआई थ्रेड पर डेटा को स्वचालित रूप से मार्शल करने के लिए अंतर्निहित तंत्र प्रदान करते हैं। एकमात्र चेतावनी यह है कि आप जिन कक्षाओं का उपयोग कर रहे हैं, उस वर्ग का उदाहरण यूआई थ्रेड पर बनाया जाना चाहिए। चूंकि आपको एसिंक्रोनस काम को निष्पादित करने से पहले सेट अप करने की आवश्यकता है, इसलिए यह आमतौर पर कोई समस्या नहीं है; यह मुफ्त में आता है।

यदि आप इसे इस तरह से करते हैं, तो आपको यहां तक ​​कि यहां सुझाए गए तीन अलग-अलग हिस्सों जैसे किसी भी हैक की आवश्यकता नहीं होगी (जिनमें से दो को अवरुद्ध कर दिया गया है " मेरा यूआई थ्रेड, अब क्या? "वैसे भी परिदृश्य)।

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