2012-08-22 26 views
10

olarak nasıl seçilir Seçeceğiniz belirli bir metnin bir dizinini ve uzunluğunu (veya EndIndex) seçtiyseniz, bunu RichTextBox'ın WPF sürümünde nasıl gerçekleştirirsiniz?RichTextBox metni bir dizin ve uzunluk

Bu, Textbox'taki gibi çok kullanışlıdır. (StartIndex, Length) ancak RTB'de eşdeğer bir şey göremiyorum.

Düzenleme:

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

vurgulama özelliği yalnızca çalışır: Ben seçim yapıldıktan sonra satırı vurgulamak çalıştığınızda, bir seçimi

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; 
     } 
Ancak

yapma cevabını bulduk ilk denemede ve ikinci denemeden sonra molalar. Bunun sebebini bilen var mı?

cevap

-1

RichTextBox.Selection özelliğinde Select() yöntemini kullanın.

+0

seç yöntem iki metin işaretçiler alır ve sadece var Her iki tam sayı olan bir dizin ve uzunluk. Bu durumda textpointer değişkenlerimi doğru şekilde nasıl kurarım? – l46kok

-1

Blockquote boşluklarla arasında metin alabilirsiniz .....

özel dize RichWordOver (RichTextBox rch, 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); 
    } 

özel geçersiz rchText_MouseClick (object sender, MouseEventArgs e) MessageBox.Show (RichWordOver (rchText, eX, eY)); }

4

Tamam bu soru eski ama sonunda burayı buraya ekledim.

RichTextBox kullanarak bazı Syntaxhighlighter yapmaya çalıştığımda, benzer sorunlar yaşıyordum. Öğrendiklerim, ApplyPropertyValue ile birlikte çalıştığınızda, GetPositionAtOffset artık kullanamazsınız. Mülkiyet değerlerinin uygulanmasının, Belge içindeki TextTokens'in “içsel konumlarını” değiştirdiğini, dolayısıyla da bu işlevselliği “frenlediğini” düşünüyorum.

Çözüm:

Eğer GetPositionAtOffset Belgesinin tam TextRange üzerinde ClearAllProperties ardından ApplyPropertyValuekullanarak tüm özelliklerini yeniden ilk çağrı ile çalışması gereken her şey ama sağdan sola ThisTime . (sağ en yüksek sapma anlamına gelir)

Herhangi bir PropertyValues ​​uygulamasının Seçim vurgulamasını bekleyip uyguamadığını bilmiyorum, bu yüzden daha fazla düşünmeniz gerekebilir.

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)); 
     } 
    } 

Ve ben böyle düzelttim:

Bu sorunu neden benim kod baktım nasıl

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)); 
     } 
    }