2012-08-22 17 views
10

दिए गए RichTextBox पाठ का चयन कैसे करें यदि आपको केवल एक निश्चित पाठ का एक इंडेक्स और लम्बाई (या एंडइंडेक्स) दिया गया है, तो आप इसे RichTextBox के WPF संस्करण में कैसे करते हैं?एक सूचकांक और लंबाई

यह टेक्स्टबॉक्स में बहुत ही कामयाब है क्योंकि आप टेक्स्टबॉक्स को कॉल कर सकते हैं। चयन करें (स्टार्ट इंडेक्स, लंबाई) लेकिन मुझे आरटीबी में समतुल्य कुछ भी दिखाई नहीं देता है।

संपादित करें:

rtb.Selection.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.LightBlue)); 

हाइलाइटिंग सुविधा केवल काम करता है: मैं एक चयन

internal string Select(RichTextBox rtb, int index, int length) 
     { 
      TextRange textRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd); 

      if (textRange.Text.Length >= (index + length)) 
      { 
       TextPointer start = textRange.Start.GetPositionAtOffset(index, LogicalDirection.Forward); 
       TextPointer end = textRange.Start.GetPositionAtOffset(index + length, LogicalDirection.Backward); 
       rtb.Selection.Select(start, end); 
      } 
      return rtb.Selection.Text; 
     } 

हालांकि बनाने, जब मैं रेखा को उजागर करने की कोशिश के बाद चयन किया गया है का जवाब मिल गया है दूसरी कोशिश के बाद पहली कोशिश और ब्रेक पर। किसी को इसका कारण पता है?

उत्तर

-1

RichTextBox.Selection संपत्ति पर Select() विधि का उपयोग करें।

+0

पद्धति का चयन करें दो पाठ संकेत में लेता है और मैं केवल मिल गया है एक सूचकांक और काम करने के लिए लंबाई जो दोनों पूर्णांक हैं। मैं इस मामले में अपने टेक्स्टपोइंटर चर को कैसे व्यवस्थित कर सकता हूं? – l46kok

-1

Blockquote आप रिक्त स्थान के बीच पाठ प्राप्त कर सकते हैं .....

निजी स्ट्रिंग RichWordOver (RichTextBox आरसीएच, int x, int y) {

 int pos = rch.GetCharIndexFromPosition(new Point(x, y)); 
     if (pos <= 0) return ""; 


     string txt = rch.Text; 

     int start_pos; 
     for (start_pos = pos; start_pos >= 0; start_pos--) 
     { 

      char ch = txt[start_pos]; 
      if (!char.IsLetterOrDigit(ch) && !(ch=='_')) break; 
     } 
     start_pos++; 
     int end_pos; 
     for (end_pos = pos; end_pos < txt.Length; end_pos++) 
     { 
      char ch = txt[end_pos]; 
      if (!char.IsLetterOrDigit(ch) && !(ch == '_')) break; 
     } 
     end_pos--; 


     if (start_pos > end_pos) return ""; 
     return txt.Substring(start_pos, end_pos - start_pos + 1); 
    } 

निजी शून्य rchText_MouseClick (ऑब्जेक्ट प्रेषक, MouseEventArgs ई) { संदेशबॉक्स। शो (RichWordOver (rchText, eX, eY)); }

4

ठीक है यह सवाल पुराना है लेकिन मुझे अंततः उत्तर मिला, इसलिए मैंने इसे यहां रखा।

जब मैं RichTextBox का उपयोग करके कुछ सिंटेक्सहाइग्लाइटर बनाने की कोशिश करता था तो मुझे समान समस्याएं थीं। मुझे पता चला कि, जब आप के साथ खेलते हैं तो लागू करेंप्रॉपर्टी वैल्यू आप GetPositionAtOffset का उपयोग नहीं कर सकते हैं। मेरा मानना ​​है कि संपत्तियों को लागू करने से दस्तावेज़ के अंदर टेक्स्टटोकेंस की "आंतरिक स्थिति" बदलती है, इसलिए इस कार्यक्षमता को 'ब्रेक लगाना' है।

वर्कअराउंड:

हर आप GetPositionAtOffset पहली कॉल दस्तावेज़ की पूरी TextRange पर ClearAllProperties, तो ApplyPropertyValue का उपयोग कर अपने सभी गुण पुन: लागू के साथ काम करने की जरूरत है लेकिन thistime सही से बाईं ओर । (सही मतलब है उच्चतम ऑफसेट)

मुझे नहीं पता कि आपने कोई प्रॉपर्टीवैल्यूज़ को चयन हाइलाइट करने की अपेक्षा की है या नहीं, तो आपको अधिक सोचने की आवश्यकता हो सकती है।

private void _highlightTokens(FlowDocument document) 
    { 
     TextRange fullRange = new TextRange(document.ContentStart, document.ContentEnd); 
     foreach (Token token in _tokenizer.GetTokens(fullRange.Text)) 
     { 
      TextPointer start = fullRange.Start.GetPositionAtOffset(token.Position); 
      TextPointer end = start.GetPositionAtOffset(token.Length); 

      TextRange range = new TextRange(start, end); 
      range.ApplyPropertyValue(TextElement.ForegroundProperty, _getTokenColor(token)); 
     } 
    } 

और मैं इसे इस तरह से तय:

यह कैसे मेरे कोड देखा जब यह समस्या का कारण बना है

private void _highlightTokens(FlowDocument document) 
    { 
     TextRange fullRange = new TextRange(document.ContentStart, document.ContentEnd); 
     fullRange.ClearAllProperties(); // NOTICE: first remove allProperties. 
     foreach (Token token in _tokenizer.GetTokens(fullRange.Text).Reverse()) // NOTICE: Reverse() to make the "right to left" work 
     { 
      TextPointer start = fullRange.Start.GetPositionAtOffset(token.Position); 
      TextPointer end = start.GetPositionAtOffset(token.Length); 

      TextRange range = new TextRange(start, end); 
      range.ApplyPropertyValue(TextElement.ForegroundProperty, _getTokenColor(token)); 
     } 
    } 
संबंधित मुद्दे