2010-04-07 7 views
6

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

Screenshot of described artifacts

माइक्रोसॉफ्ट पर उन का कहना है कि WinForms एमडीआई पहले से ही एमडीआई के लिए पर्याप्त उपाय है और यद्यपि मैं यह मुश्किल है कि वे एक WPF अनुप्रयोग की वजह से इस तरह से बनाने की कोशिश की पर विश्वास करने लगता है WPF में पुनर्रचना की जरूरत नहीं है स्पष्ट कमियां

अद्यतन: कुछ अतिरिक्त नोट्स जिन्हें मैंने छोड़ा था, यह है कि अगर मैं इन फॉर्मों को एमडीआईपीेंट सेट किए बिना बना देता हूं तो वे नियमित रूपों के रूप में बनाए जाते हैं और यह समस्या नहीं होती है। यह समस्या WinForms एमडीआई परिदृश्य के लिए अद्वितीय लगता है। इसके अलावा मैं वर्तमान में विंडोज 7 एंटरप्राइज़ पर चल रहा हूं और मुझे पता है कि परिणाम विंडोज एक्सपी पर काफी अलग हो सकते हैं लेकिन मैं इसका परीक्षण करने में सक्षम नहीं हूं।

अद्यतन: मुझे इस मुद्दे पर कुछ अन्य संबंधित संसाधन मिल गए हैं, मैंने सोचा कि मुझे साझा करना चाहिए।

उत्तर

2

ठीक है, मैं एक समाधान पाया है हो सकता है, हालांकि यह एक हैक का एक सा तरह लगता है। ऐसा प्रतीत होता है कि यदि आप एमडीआई माता-पिता पर रीफ्रेश विधि को कॉल करते हैं, जब भी एक बच्चा एमडीआई फॉर्म स्थानांतरित हो जाता है, तो प्रसिद्ध कलाकृतियों को दूर कर दिया जाता है। खिड़की खींचते समय दृश्यमान चीजें थोड़ा झटकेदार दिखाई देती हैं लेकिन मेरे मूल पोस्ट में दिखाए गए उदाहरण की तुलना में यह अधिक स्वीकार्य लगता है।

private void Form1_Move(object sender, EventArgs e) 
{ 
    this.ParentForm.Refresh(); 

    System.Diagnostics.Debug.WriteLine(string.Format("Form Moved to: ({0},{1})", this.Left, this.Top)); 
} 

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

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

8

ऐसा प्रतीत होता है कि हार्डवेयर त्वरण का लाभ उठाने के विरोध में एक और कामकाज सॉफ़्टवेयर प्रतिपादन पर वापस जाना है।एमएसडीएन मंचों पर यह suggestion by Marco Zhou था।

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
     this.Loaded += delegate 
     { 
      var source = PresentationSource.FromVisual(this); 
      var hwndTarget = source.CompositionTarget as HwndTarget; 
      if (hwndTarget != null) 
      { 
       hwndTarget.RenderMode = RenderMode.SoftwareOnly; 
      } 
     }; 
    } 
} 

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

यह भी ध्यान रखना महत्वपूर्ण है कि मुझे लगता है कि सॉफ्टवेयर प्रस्तुति से एक्सपी सिस्टम पर एकमात्र विकल्प है और आम तौर पर विजुअल फॉक्सप्रो नोर विनफॉर्म आमतौर पर उसी प्रकार के हार्डवेयर त्वरण का लाभ उठाते हैं जो मूल WPF ऐप्स Vista OS पर करते हैं और अप। तो इस विकल्प का उपयोग करना उतना बुरा नहीं हो सकता है जब आपको इंटरऑप से निपटने की ज़रूरत होती है। वर्तमान में मुझे इस समाधान का उपयोग करते समय किसी भी संबंधित साइड इफेक्ट्स से अवगत नहीं है, लेकिन यदि कोई है तो उन्हें गंभीर विचार में लेना होगा।

2

वीडियो ड्राइवरों की जांच करें और हार्डवेयर त्वरण को अक्षम करने का प्रयास करें। अधिकांश कलाकृतियों खराब ड्राइवरों, वीडियो कार्ड में असफल होने या ताज़ा करने के लिए अपर्याप्त समय के कारण होते हैं।

पहला समस्या निवारण चरण: वीडियो ड्राइवर अपडेट करें। जाहिर है, मुझे पता है।

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

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

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

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

प्रतिपादन टीयर स्तर नोट्स और WPF प्रदर्शन जानकारी ->http://msdn.microsoft.com/en-us/library/vstudio/ms742196(v=vs.90).aspx

आशा इस कोई मदद करता है।

--Ryan Strassburg

0

अपने UserControl या खिड़की लोड घटना;

this.WindowState = System.Windows.WindowState.Minimized; 

this.WindowState = System.Windows.WindowState.Normal; 

यह खराब समाधान प्रतीत हो सकता है। दीवार के खिलाफ अपने सिर को मारने की जरूरत नहीं है।

एक तुर्की नीति कहता है: कोड सबसे अच्छा कोड है कोड चल रहा है :)