2013-08-23 6 views
5

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

संपादित करें: इसलिए मुझे लगता है कि इसकी आवश्यकता नहीं है, मैं बस यह समझने की कोशिश कर रहा हूं कि मुझे इसके बजाय क्या करना चाहिए था। मेरा मुख्य प्रश्न WPF if the children of a scrollviewer resize, will the scrollviewer automatically update its extent?

परन्तु मैं भी उत्सुक था कि क्या मैं बाइंडिंग अपडेट करने की प्रतीक्षा कर सकता हूं या अगर कोई गारंटी भी है कि किसी दूसरे के सामने एक बाध्यकारी अपडेट है? क्या मुझे इस तरह कोड करने की उम्मीद है कि बाध्यकारी अपडेट के आदेश से कोई फर्क नहीं पड़ता? वर्तमान में मैंने निर्भरता संपत्ति का उपयोग कॉलबैक बदल दिया है जो विभिन्न सामानों को निष्पादित करता है जो

+2

क्या आप वर्णन कर सकते हैं कि यह आवश्यक क्यों है? यह नहीं होना चाहिए, और संभवत: आप जो करना चाहते हैं उसे पूरा करने के लिए एक बेहतर तरीका मौजूद है। – user7116

+4

आप 'डिस्पैचर.बिनजिन इनवोक()' पर एक नज़र डालना चाहते हैं, सबसे सटीक अधिभार जो 'डिस्पैचर प्राथमिकता' स्वीकार करता है। –

+1

मुझे कुछ लोड होने पर WPF में ईवेंट के क्रम के बारे में लिखना [एक उत्तर] (http://stackoverflow.com/a/16217573/302677) लिखना याद है। आपको यह उपयोगी लगेगा। लेकिन डिस्पैचर का उपयोग करने के लिए हाईकोर का सुझाव शायद आप जो खोज रहे हैं। (साथ ही, डिस्पैचर मुख्य यूआई थ्रेड का संदर्भ देता है, और इसमें उस थ्रेड पर विभिन्न प्राथमिकता स्तरों पर कोड चलाने की क्षमता है। यह वास्तव में एक अलग थ्रेड नहीं है) – Rachel

उत्तर

4

अद्यतन करने वाले अन्य गुणों पर अक्सर निर्भर होते हैं। प्रेषक के पास एकल कार्यों को संसाधित करने के लिए कई प्राथमिकताएं होती हैं। मुझे पूरा यकीन है कि आप निर्भरता गुणों के कॉलबैक की प्राथमिकता को नहीं बदल सकते हैं। अगर वे डेटा बाध्यकारी द्वारा बदल दिए गए थे, तो वे DispatcherPriority.DataBinding प्राथमिकता के साथ कतार में होंगे। आप कुछ निर्भरता गुणों के मानों का उपयोग करते हैं जो लेआउट/अन्य निर्भरता गुणों को बदलने के कारण बनेंगे। और जब तक आप इन लेआउट अपडेट/परिवर्तन संसाधित नहीं होते हैं और फिर वर्तमान यूआई स्थिति के साथ कुछ करते हैं, तब तक आप अपने पहले मैनिपुलेशन के बाद प्रतीक्षा करना चाहते हैं?

WinForms के पास ऐसे मामलों के लिए DoEvents फ़ंक्शन था जो सामान्य कोड निष्पादन जारी रखने से पहले सभी यूआई घटनाओं को संसाधित करता है। कॉल रिटर्न का मतलब है कि के बाद प्रतिनिधि डिस्पैचर द्वारा मार डाला गया था

public static void DoEvents() 
{ 
    if (Application.Current == null) 
    return; 
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, (Delegate) (() => {})); 
} 

खाली प्रतिनिधि तुल्यकालिक शुरू हो जाती है,: WPF ऐसी कोई builtin समारोह है, लेकिन आप अपने खुद के DoEvents लिख सकते हैं। DispatcherPriority.Background बहुत कम प्राथमिकता है ताकि उदाहरण के लिए डेटा बाइंडिंग, लेआउट अपडेट या प्रतिपादन के बाद यह प्रेषक कॉल संसाधित हो। http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherpriority.aspx

तो निर्भरता गुणों के पहले हेरफेर के बाद और अन्य निर्भरता गुणों को पढ़ने से पहले इसे करने के लिए DoEvents() को कॉल करें और इसे किया जाना चाहिए।

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