c# - Overriding DrawItem for ListBox - unselected items are not redrawn -


यह एक सी # डेस्कटॉप अनुप्रयोग है। DrawStyle मेरे ListBox की संपत्ति OwnDrawFixed पर सेट है।

समस्या: I DrawItem को अलग-अलग फोंट में टेक्स्ट खींचने के लिए ओवरराइड करें, और यह काम करता है। लेकिन जब मैं रनटाइम पर फ़ॉर्म का आकार बदलना शुरू करता हूं, तो चयनित आइटम सही तरीके से तैयार होता है, लेकिन बाकी सबको दोबारा नहीं बनाया जाता है, जिससे असंख्य वस्तुओं के लिए भ्रष्ट दिखने वाला पाठ होता है।

यहां मेरा कोड है:

<पूर्व> निजी शून्य सूचीडिवाइस_ड्राइटम (ऑब्जेक्ट प्रेषक, ड्रॉइटेमइवेंटएरग्स ई) {ई। ड्रॉबैकग्राउंड (); स्ट्रिंग टेक्स्टडिवाइस = ((सूचीबॉक्स्) प्रेषक) .ऐम्स [ई। इंडैक्स] .ओस्ट्रिंग (); E.Graphics.DrawString (textDevice, नया फ़ॉन्ट ("एरियल", 15, फ़ॉन्ट शैली), नया सॉलिडब्रश (रंग। ब्लैक), ई। बाउंड्स, स्ट्रिंगफ़ॉर्मेट। जेनरिक डिफॉल्ट); // आइपी स्ट्रिंगफॉर्मैट कॉपी = नया स्ट्रिंगफॉर्मैट (स्ट्रिंगफ़ॉर्मैटफ़्लैग्स.नहीं वाल | स्ट्रिंगफॉर्मैटफ्लैग्स.मजेशट्रैलींगस्पेस) को आकर्षित करने के लिए देखें; Copy.SetMeasurableCharacterRanges (नया वर्णरेखा [] {नए वर्ण रेंज (0, textDevice.Length)}); क्षेत्र [] क्षेत्रों = e.Graphics.MeasureCharacterRanges (टेक्स्टडिवाइस, नया फ़ॉन्ट ("एरियल", 15, FontStyle.Bold), ई। बाउंस, प्रतिलिपि); इंट चौड़ाई = (इंट) (क्षेत्रों [0] .गेटबाउंड (ई। ग्राफिक्स)। विडथ); आयत रीक्ट = ई। बाउंड; Rect.X + = चौड़ाई; Rect.Width - = चौड़ाई; // डुप्लिकेट आईपी ई। ग्राफिक्स.ड्रास्ट्रिंग ("255.255.255.255", नया फ़ॉन्ट ("कूरियर न्यू", 10), नया सॉलिडब्रश (रंग। डार्कब्लू), रीक्ट, कॉपी); e.DrawFocusRectangle (); } ListDevices.Items.Add ("Device001"); listDevices.Items.Add ( "Device002");

इसके अलावा, सही ढंग से तैयार की गई वस्तु (चयनित एक) फार्म रीसाइजिंग पर चंचल है। कोई बड़ी बात नहीं है, लेकिन अगर किसी को पता है क्यों .... tnx

निम्न कोड को पुन: आकार की घटना में रखें :

<पूर्व> निजी शून्य सूचीडिवाइस_आकार (वस्तु प्रेषक, इवेंटएरग्स ई) {listDevices.Invalidate (); }

यह सब कुछ पुनर्मुद्रित होना चाहिए।

चंचल को रोकने के लिए, आपको डबल बफरिंग की आवश्यकता होती है।

ऐसा करने के लिए, नया वर्ग, सूचीबॉक्स से प्राप्त किया गया है, और निम्नलिखित में निर्माता को डाल दिया है:

  this.SetStyle (ControlStyles.OptimizedDoubleBuffer, सच);  

या बस इसे एक कोड फ़ाइल में पेस्ट करें:

  System.Windows.Forms का उपयोग कर; नामस्थान जो कुछ भी {सार्वजनिक वर्ग डीबीलिस्टबॉक्स: लिस्ट बॉक्स (सार्वजनिक DBListBox (): बेस () {this.Doublebuffered = true; // या // यह.SetStyle (ControlStyles.OptimizedDoubleBuffer, सच); }}}  

अपने प्रोजेक्ट के नेमस्पेस के साथ "जो भी हो" बदलें, या इसे और अधिक उपयोगी बनाने के लिए संकलन के बाद, आपको प्रपत्र डिज़ाइनर में एक डीबीआईलिस्टबॉक्स जोड़ने में सक्षम होना चाहिए।


Comments