2011-03-10 36 views

回答

0

我找到了解决办法。也许还有一个更简单的方法,如果是的话请让我知道

private void OnHasRtbReachedEnd(System.Windows.Controls.RichTextBox rtb) 
    { 
     TextPointer pointer1 = rtb.CaretPosition; 
     int iCurrentLine = GetLineNumber(rtb); 
     rtb.CaretPosition = rtb.Document.ContentEnd; 
     int iLastLine = GetLineNumber(rtb); 

     if (iCurrentLine == iLastLine) 
     { 
      if (!_bIsRtbMovingUpDown) 
       MoveToNextDataGridRow(); 
      _bIsRtbMovingUpDown= false; 
     } 
     else 
     { 
      _bIsRtbMovingUpDown= true; 
     } 
     rtb.CaretPosition = pointer1; 
    } 

//此代码来自 // http://social.msdn.microsoft.com/Forums/en/wpf/thread/667b5d2a-84c3-4bc0-a6c0-33f9933db07f

private int GetLineNumber(System.Windows.Controls.RichTextBox rtb) 
    { 
     TextPointer caretLineStart = rtb.CaretPosition.GetLineStartPosition(0); 
     TextPointer p = rtb.Document.ContentStart.GetLineStartPosition(0); 
     int caretLineNumber = 1; 

     while (true) 
     { 
      if (caretLineStart.CompareTo(p) < 0) 
      { 
       break; 
      } 

      int result; 
      p = p.GetLineStartPosition(1, out result); 

      if (result == 0) 
      { 
       break; 
      } 

      caretLineNumber++; 
     } 
     return caretLineNumber; 

    } 
1

请核实MSDN链接

http://social.msdn.microsoft.com/Forums/en/wpf/thread/667b5d2a-84c3-4bc0-a6c0-33f9933db07f

如果你真的想知道脱字符的行号,你可以做类似下面的事情(可能需要一些twea王):

TextPointer caretLineStart = rtb.CaretPosition.GetLineStartPosition(0); 
TextPointer p = rtb.Document.ContentStart.GetLineStartPosition(0); 
int caretLineNumber = 1; 

while (true) 
{ 
    if (caretLineStart.CompareTo(p) < 0) 
    { 
     break; 
    } 

    int result; 
    p = p.GetLineStartPosition(1, out result); 

    if (result == 0) 
    { 
     break; 
    } 

    caretLineNumber++; 
} 
+0

嗨纪, 谢谢!我只是发布我找到的解决方案! :) – okidoki 2011-03-10 11:09:00

+0

我得到了该链接的解决方案 – 2011-03-10 11:11:13

+0

更改caretLineStart.CompareTo(p)<0 to caretLineStart.CompareTo(p)<= 0,为情况(空白行) – 2013-06-07 07:32:29

1

代码即可获得行数:

Int32 CountDisplayedLines(RichTextBox rtb) 
{ 
    Int32 result = -1; 

    rtb.CaretPosition = rtb.Document.ContentStart; 

    while (rtb.CaretPosition.GetLineStartPosition(++result) != null) 
    { 
    } 

    return result; 
} 
+0

太棒了,它的工作原理。 – 2013-06-07 07:31:11

0

我试过的代码,而不是总是给正确的结果。 一个聪明的办法来做到这一点是这个

int previousCursorPosition; 
    private void RichTarget_KeyDown_1(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Up || e.Key == Key.Down) 
     { 
      Xceed.Wpf.Toolkit.RichTextBox rich = (Xceed.Wpf.Toolkit.RichTextBox)sender; 
      previousCursorPosition = rich.CaretPosition.GetOffsetToPosition(rich.CaretPosition.DocumentStart); 
     } 
    } 
    private void RichTextBox_KeyUp_1(object sender, KeyEventArgs e) 
    { 

      if (e.Key == Key.Up) 
      { 
       Xceed.Wpf.Toolkit.RichTextBox rich = (Xceed.Wpf.Toolkit.RichTextBox)sender; 

       if (previousCursorPosition == rich.CaretPosition.GetOffsetToPosition(rich.CaretPosition.DocumentStart)) 
       { 
        //do your staff 

       } 

      } 
      else if (e.Key == Key.Down) 
      { 
       Xceed.Wpf.Toolkit.RichTextBox rich = (Xceed.Wpf.Toolkit.RichTextBox)sender; 
       if (previousCursorPosition == rich.CaretPosition.GetOffsetToPosition(rich.CaretPosition.DocumentStart)) 
       { 
        //do your staff 
       } 
      } 


    } 
相关问题