2009-09-11 25 views
18

एक डब्ल्यूपीएफ एप्लीकेशन में, मैं एक "फाइलों में खोजें" आउटपुट फलक बनाना चाहता हूं, जिसमें मैं प्रत्येक पंक्ति पर स्मृति आवंटित किए बिना बड़ी मात्रा में टेक्स्ट स्ट्रीम कर सकता हूं, जैसे TextBox कर।बड़ी सामग्री के लिए डब्ल्यूपीएफ मल्टीलाइन टेक्स्टबॉक्स

WPF TextBox में एक Text संपत्ति है जो एक संगत स्ट्रिंग संग्रहीत करती है। हर बार, मैं सामग्री जोड़ना चाहता हूं, मुझे textBox.Text += "New Text" करना है, जो खराब है।

आदर्श रूप से, यह नियंत्रण वर्चुअल होगा और केवल दृश्यमान लाइनों के लिए न्यूनतम संसाधनों की आवश्यकता होगी।

मैंने का उपयोग VirtualizingStackPanel के साथ करने के बारे में सोचा, लेकिन यह टेक्स्ट चयन को लाइनों में अनुमति नहीं देता है।

(प्रत्येक नई लाइन पर कहा, मैं अद्यतन करने के लिए नियंत्रण चाहते हैं)

कोई भी सुझाव?

+0

सूची बॉक्स –

+1

@ टिमोथी के बजाय एक स्टैक पैनल की कोशिश करें - यह टेक्स्ट चयन को लाइनों में कैसे अनुमति देगा? –

+4

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

उत्तर

17

यदि आप अपने आवेदन में दस हजार से अधिक खोज परिणामों की अपेक्षा नहीं करते हैं, तो टेक्स्टब्लॉक नियंत्रण या रीडोनली मल्टीलाइन टेक्स्टबॉक्स अब तक पर्याप्त होगा।

टेक्स्टबॉक्स श्रेणी में एक AppendText() विधि है जो आपके लिए पर्याप्त तेज़ी से होनी चाहिए।

यदि आपको टेक्स्ट हाइलाइटिंग/स्वरूपण की आवश्यकता है तो शायद आप RichTextBox का उपयोग करना चाहते हैं।

+1

धन्यवाद कोडेमैनिक्स, एमएसडीएन दस्तावेज़ कहता है: AppendText विधि उपयोगकर्ता को टेक्स्ट कंसटेनेशन का उपयोग किए बिना पाठ नियंत्रण की सामग्री में टेक्स्ट संलग्न करने में सक्षम बनाता है, जो कई concatenations की आवश्यकता होने पर बेहतर प्रदर्शन कर सकते हैं। .NET परावर्तक के अंदर कार्यान्वयन को देखने के बाद, AppendText बिल्कुल वही है जो मुझे चाहिए। – decasteljau

+2

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

+10

ध्यान रखें कि टेक्स्टबॉक्स पूर्ववत संचालन के लिए आपके प्रत्येक ऐप को संग्रहीत कर सकता है। आप टेक्स्टबॉक्स पर UndoLimit फ़ील्ड को बदलना चाहेंगे। – Kelly

0

क्या आपने RichTextBox नियंत्रण पर विचार किया है या कोशिश की है?

+0

हमने कोशिश की है, लेकिन प्रदर्शन स्ट्रिंग स्वरूपण से संबंधित ओवरकिल की वजह से विनाशकारी हो गया है, जिसकी मुझे आवश्यकता नहीं है। – decasteljau

+0

मुझे बताने के लिए धन्यवाद। @ कोडीमैनिक्स का जवाब सही लगता है - मुझे यह नहीं पता था। –

-1

एक stringbuilder, बस स्ट्रिंग बिल्डर में पाठ संलग्न है और इसके बजाय कर

textBox.Text += moreText; 

कर

myStringBuilder.Append(moreText); 
textBox.Text = myStringBuilder.ToString(); 

यह Schlemiel the Painter's एल्गोरिथ्म का ध्यान रखना चाहिए की।

बेशक, स्ट्रिंग बिल्डर को आपकी कक्षा का सदस्य होना चाहिए, इसलिए यह आपके ऑब्जेक्ट के जीवन काल के माध्यम से मौजूद है।

+0

प्रत्येक बार जब आप स्ट्रिंगबिल्डर पर ToString() को कॉल करते हैं, तो यह समेकित तारों वाली एक नई संगत स्ट्रिंग आवंटित करता है। चूंकि मैं हर समय नियंत्रण में नई लाइनों को जोड़ रहा हूं, मैं बिल्कुल यह नहीं चाहता हूं। प्रत्येक नई लाइन के लिए, मैं नियंत्रण को अपडेट करना चाहता हूं। – decasteljau

5

यदि आपके पास वास्तव में बड़ी सामग्री है, तो दुर्भाग्यवश सभी WPF टेक्स्टबॉक्स और समान नियंत्रण बहुत धीमे हैं। this question देखें। आप प्रतिस्थापन के रूप में AvalonEdit का उपयोग कर सकते हैं।

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