2009-10-16 22 views
6

मैं अपने डब्ल्यूपीएफ एप्लिकेशन में थोड़ा एनीमेशन जोड़ रहा हूं।डब्ल्यूपीएफ - लेआउट अपडेटेड इवेंट फायरिंग बार-बार

Dan Crevier's unique solution to animating the children of a panelawesome WPF Penner animations के साथ संयुक्त awesome WPF Penner animations के साथ संयुक्त यह मेरे नियंत्रणों में से एक को शानदार लग रहा है और इसके बच्चे कुछ अच्छी एनीमेशन के साथ आगे बढ़ने के लिए काफी सरल हैं।

दुर्भाग्य से यह सब एक प्रदर्शन ओवरहेड के साथ आता है। जब आइटम जोड़े/हटाए जाते हैं या नियंत्रण का आकार बदलता है तो मुझे प्रदर्शन प्रभावित होता है, लेकिन ऐसा लगता है कि यह perf हिट एप्लिकेशन के पूरे जीवनकाल में लगातार होती है, भले ही आइटम पूरी तरह स्थैतिक हों।

PanelLayoutAnimator कक्षा UIElement.LayoutUpdated ईवेंट को हुक करने के लिए संलग्न संपत्ति का उपयोग करती है। जब यह घटना आग लगती है, तो बच्चों को अपनी नई स्थिति में घुमाने के लिए परिवर्तनों को प्रस्तुत करने के लिए एनिमेटेड किया जाता है।

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

तो मेरा सवाल यह है कि, मैं यहां प्रदर्शन को कैसे सुधार सकता हूं? कोई जवाब सहायता की सराहना कर दिया जाना था, लेकिन मैं वर्तमान में इन उप-सवाल पर अटक कर रहा हूँ:

  1. क्या LayoutUpdated घटना इतनी बार आग का कारण बनता है? क्या ऐसा होना चाहिए, और यदि नहीं, तो मैं कैसे पता लगा सकता हूं कि यह क्यों फायरिंग और इसे कम कर रहा है?

  2. क्या हैंडलर के भीतर यह पता लगाने के लिए एक और सुविधाजनक तरीका है कि कुछ ऐसा हुआ है जो बच्चों को ले जा सकता है? यदि ऐसा है, तो मैं जल्दी से जमानत कर सकता हूं और प्रत्येक बच्चे को लूप करने के ऊपरी हिस्से से बच सकता हूं।

अभी के लिए मैं इस समस्या के एनीमेशन अक्षम करने जब वहाँ पैनल में एक से अधिक एन बच्चे हैं द्वारा काम करेंगे।

+0

ड्रयू, आप छोटे कोड नमूना जो समस्या को पुन: शामिल हो सकते हैं कृपया सकता है? – Anvaka

+0

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

+0

हम्म ऐप काफी बड़ा है। यदि लेआउट अपडेटेड नियमित रूप से फायरिंग नहीं किया जाना चाहिए, तो यह पता लगाने के लिए कि मैं फायरिंग क्यों कर रहा हूं, मैं किस तकनीक का उपयोग कर सकता हूं? –

उत्तर

7

यदि आप EventHandler से UI को अद्यतन कर रहे हैं, तो आप लेआउट अपडेटेड ईवेंट से जुड़े हुए हैं, यह उस ईवेंट को भी ट्रिगर करेगा!

उदाहरण के लिए:

void my_LayoutUpdatedEvent(object sender, EventArgs e) 
    { 
     textBlock1.Text = "changed"; 
     Console.Out.WriteLine("text changed!"); 
    } 

अपडेट की एक अनंत लूप में जाना जाएगा।

शायद आप कुछ इस तरह करने की जरूरत है:

void my_BetterLayoutUpdatedEvent(object sender, EventArgs e) 
    { 
     if (!hasChanged) 
      textBlock1.Text = "changed"; 
     hasChanged = true; 
     Console.Out.WriteLine("text changed!"); 
    } 
+2

दिलचस्प बिंदु, और यह बनाता है समझ। मैं अब उस एप्लिकेशन पर काम नहीं कर रहा हूं, लेकिन यह सराहनीय लगता है। उम्मीद है कि यह किसी और की मदद करता है। –

+0

क्या यह जांचना संभव है कि कौन सा यूआई अमान्यता के कारण अद्यतन हो रहा था? – simo

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