2009-04-30 22 views
6

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

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

क्या यह एक आम समस्या नहीं है? ऐसा लगता है कि डब्ल्यूपीएफ इस बॉक्स के बाहर कुछ भी नहीं प्रदान करता है। ऐसा क्यों है?

+0

मैंने इसके साथ थोड़ा सा खेला। लगता है कि स्क्रॉलिंग क्षेत्र की गणना के साथ समस्या कुछ है। यदि आप स्क्रॉलबार को अक्षम करते हैं, तो समस्या का प्रकार दूर हो जाता है - जब तक आप ctrl + end को हिट नहीं करते (और उसके बाद उसे नीचे या कुछ की गणना करनी होती है) एचटी टेक्स्टबॉक्स के लिए सामग्री टेम्पलेट एक स्क्रॉलव्यूवर है। शायद स्क्रॉलव्यूवर को अनुकूलित करने के साथ समस्या को और अधिक करना है। कोई जवाब नहीं, लेकिन शायद एक सुराग? – JMarsch

उत्तर

1

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

यहाँ डेवलपर द्वारा लिखित संपादक पर एक लेख है:

http://www.codeproject.com/KB/edit/AvalonEdit.aspx

+1

मुझे यह निष्कर्ष निकाला गया है कि आपके स्वयं के पाठ नियंत्रण लिखना शायद सबसे अच्छा समाधान है। हालांकि, यह थोड़ा दुखी है। – bitbonk

+3

-1। मैंने AvalonEdit का उपयोग 4 एमबी या बड़ी फ़ाइलों के साथ भयानक परिणामों के साथ किया है। बेहद छोटी गाड़ी और पागल बॉम्बर की तरह मेरे ऐप को दुर्घटनाग्रस्त कर देता है। – code4life

+1

बस एक नया वीएस डब्ल्यूपीएफ सी # प्रोजेक्ट बनाया है, NuGet AvalonEdit.Sample पैकेज जोड़ें, स्टार्टअपयूरी, रन और वॉयला बदलें! AvalonEdit एप्लिकेशन ठीक चल रहा है। एक सेकंड में 8k लाइनों के साथ 4 एमबी टेक्स्ट फ़ाइल खोल दी, जबकि टेक्स्टब्लॉक ने 22 सेकंड लिया। निश्चित रूप से टेक्स्टब्लॉक के लिए एक प्रतिस्थापन हो सकता है। –

1

आप केवल एक शैली के साथ एक टेक्स्टबॉक्स का उपयोग कर सकते हैं जो उपयोगकर्ता को टेक्स्ट देखने के लिए और अधिक जगह देता है। टेलीरिक और अन्य लोगों से शायद अधिक उन्नत नियंत्रण हैं, लेकिन यदि आपको संपादन विकल्पों की आवश्यकता नहीं है जो पर्याप्त होनी चाहिए।

+0

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

+0

उस मामले में मैं किसी तीसरे पक्ष के नियंत्रण के साथ जाऊंगा। आप अतिरिक्त फॉर्मेटिंग फीचर्स को हटा सकते हैं और नोटपैड की तरह इसे सरल बना सकते हैं। एक तृतीय पक्ष नियंत्रण उस पाठ की मात्रा को बेहतर तरीके से संभालने में सक्षम होना चाहिए जिसके बारे में आप बात कर रहे हैं। आप पाठ को किसी अन्य धागे पर भी लोड कर सकते हैं और लोड होने के बाद इसे नियंत्रण में बांध सकते हैं। – Lukasz

-1

कैसे कुछ इस तरह की कोशिश कर के बारे में:

स्मृति में पूरी स्ट्रिंग रखें लेकिन केवल एक पाठ बॉक्स में इसके बारे में 'टुकड़ा' दिखा। उस कटा हुआ स्ट्रिंग का आकार गतिशील रूप से टेक्स्टबॉक्स, फ़ॉन्ट आकार इत्यादि के आकार के आधार पर गणना की जाएगी

बेशक इसमें उचित प्रदर्शन, सिंक्रनाइज़ेशन और इसी तरह के लिए बहुत छोटा कोड शामिल नहीं है, लेकिन ऐसा लगता है कि ऐसा लगता है चले जाओ।

1

आप हमेशा तकनीकों को मिलाकर मैच कर सकते हैं: आप WinForms टेक्स्टबॉक्स को एक WPF पैरेंट पर छोड़ सकते हैं। आप स्टाइल, अस्पष्टता, एनीमेशन, ट्रांसफॉर्म इत्यादि जैसी चीजें खो देते हैं, लेकिन यदि सभी महत्वपूर्ण बात टेक्स्ट संपादित कर रहे हैं, तो WinForms टेक्स्टबॉक्स यह ठीक है।

+0

यह दुखद है, लेकिन शायद सबसे अच्छा विकल्प है। – bitbonk

3

मुझे यकीन नहीं है कि यह मदद करता है, लेकिन क्या आपने FlowDocumentPageViewer और FlowDocumentReader का उपयोग करने का प्रयास किया है?

इसमें बहुत अच्छी टिप्पणियां भी हैं और टेक्स्ट प्रारूप में दस्तावेजों को लोड करने के लिए आदर्श लगती है।

2

समस्या यह है कि टेक्स्टबॉक्स एक एकल कंटेनर तत्व है। लिस्टबॉक्स जैसे सूची नियंत्रण कंटेनर रीसाइक्लिंग के कारण बहुत अच्छी तरह वर्चुअलाइज करते हैं। टेक्स्टबॉक्स को तेज़ करने के लिए आप वास्तव में कुछ भी आसान नहीं कर सकते हैं।

 TextBox tb = new TextBox(); 
     tb.AppendText("Hello"); 

तो हाँ, तो आप इस का उपयोग कर सकते कुछ पाठ आप बस की तरह उल्लेख जोड़ने dynamicly रहे हैं:

लेकिन पाठ बॉक्स नियंत्रण एक AppendText() विधि है।

+0

कूल, मैं दस्तावेज़ों और वंचित सदस्यों को पढ़ रहा था जहां छिपा हुआ था। चूंकि AppendText() TextBoxBase से आता है, मैंने इसे नहीं देखा। – bitbonk

+0

यह अच्छी तरह से काम करता है, और यह तेज़ है: मैं लगभग एक सेकंड में टेक्स्टबॉक्स में 10,000 नई पंक्तियां जोड़ सकता हूं। जैसा कि यह सब वर्चुअलाइज्ड है, स्क्रॉलिंग बहुत तेज़ है। – Contango

1

क्या आपने WPF RichTextBox को आजमाया है? यदि आप इस मार्ग पर जाते हैं तो आप निश्चित रूप से फ़्लो डॉक्यूमेंट जानकारी पर पढ़ना चाहेंगे।

+0

मुझे आश्चर्य है कि इस मूल को बॉक्स से बाहर नहीं किया गया है। यह एक समृद्ध टेक्स्टबॉक्स में पाठ को बाध्य करने के बारे में सहज नहीं है। – BraveNewMath

0

आप FlowDocument इस्तेमाल कर सकते हैं, लेकिन यह बॉक्स से बाहर काम नहीं करता है दस्तावेज़ संपत्ति के लिए बाध्य करने के लिए एमवीवीएम में फ्लो डॉक्यूमेंट का।

एक अन्य समाधान FlowDocumentScrollViewer का उपयोग कर और उसके दस्तावेज़ संपत्ति के लिए बाध्य कर रहा है।

(। या आप भी एक FlowDocumentReader का उपयोग करें और अपने दस्तावेज़ संपत्ति, FlowDocumentScrollViewer के समान बाँध सकता है यह आपको एक अलग यूआई देता है।)

दृश्य:

<FlowDocumentScrollViewer Document="{Binding FlowDocument, Mode=OneWay}" /> 

व्यू मॉडेल:

FlowDocument fd = new FlowDocument(); 
     Paragraph p = new Paragraph(); 
     Run r = new Run(); 
     r.Text = "large text"; 
     p.Inlines.Add(r); 
     fd.Blocks.Add(p); 
     FlowDocument = fd; 

private FlowDocument _FlowDocument; 
    public FlowDocument FlowDocument 
    { 
     get{ return _FlowDocument; } 
     set 
     { 
     _FlowDocument = value; 
     NotifyOfPropertyChange(nameof(FlowDocument)); 
     } 
    } 

अतिरिक्त प्रदर्शन युक्तियों के लिए यह भी देखें: https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/optimizing-performance-text#flowdocument-textblock-and-label-controls

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