2014-06-25 3 views
4

Я разрабатываю небольшое приложение WPF, в котором есть несколько вкладок. У меня есть строка состояния внизу; требование состоит в том, чтобы показать номер белья и столбец курсора. Поэтому, когда пользователь меняет позицию курсора, имя и столбец должны обновляться автоматически. Вот код, где я добавляю RichTextBox; код, который вычисляет номер строки и столбец, находится в обработчике событий KeyDown, но это событие никогда не вызывается. Какое событие я должен обработать, чтобы получить курсор linenumber и столбец?Позиция курсора внутри RichTextBox в WPF

private void AddTabitem(string filePath, mode fileMode) 
{ 
    if (fileMode == mode.openFile) 
    { 
     if (File.Exists(filePath)) 
     { 
      RichTextBox mcRTB = new RichTextBox(); 
      mcRTB.KeyDown += new KeyEventHandler(LineNumber); 
//rest of the code goes here 
     } 
    } 
} 
mcRTB.KeyDown += new KeyEventHandler(LineNumber); 

private void LineNumber(object sender, KeyEventArgs e) 
{   
    TextPointer tp1 = rtbList[EditorTabcontrol.SelectedIndex].Selection.Start.GetLineStartPosition(0); 
    TextPointer tp2 = rtbList[EditorTabcontrol.SelectedIndex].Selection.Start; 

    int column = tp1.GetOffsetToPosition(tp2); 

    int someBigNumber = int.MaxValue; 
    int lineMoved, currentLineNumber; 
    rtbList[EditorTabcontrol.SelectedIndex].Selection.Start.GetLineStartPosition(-someBigNumber, out lineMoved); 
    currentLineNumber = -lineMoved; 
    string LineColumnLabel; 

    //LineColumnLabel.Content = "Line: " + currentLineNumber.ToString() + " Column: " + column.ToString(); 
    LineColumnLabel = "Line: " + currentLineNumber.ToString() + " Column: " + column.ToString();   
} 

ответ

3

В MSDN есть стандартный пример (http://msdn.microsoft.com/en-us/library/system.windows.controls.richtextbox.caretposition%28v=vs.110%29.aspx). Обратите внимание, что в этом контексте «курсор» называется «кареткой». Пример из MSDN следующим образом:

// Create a new FlowDocument, and add 3 paragraphs. 
FlowDocument flowDoc = new FlowDocument(); 
flowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 1"))); 
flowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 2"))); 
flowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 3"))); 
// Set the FlowDocument to be the content for a new RichTextBox. 
RichTextBox rtb = new RichTextBox(flowDoc); 

// Get the current caret position. 
TextPointer caretPos = rtb.CaretPosition; 

// Set the TextPointer to the end of the current document. 
caretPos = caretPos.DocumentEnd; 

// Specify the new caret position at the end of the current document. 
rtb.CaretPosition = caretPos; 
2

использовать этот код, чтобы найти и положение линии

WPF

"<Label x:Name="LabellineNr" Content="line#" BorderThickness="1" BorderBrush="DarkGray" /> 
    "<Label x:Name="LabelColumnNr" Content="Column#" BorderThickness="1" BorderBrush="DarkGray"/> 

C# код

private int privLineID = 1; 
    public int LineID 
    { 
     get { return privLineID; } 
     set 
     { 
      privLineID = value; 
      LabellineNr.Content = "Line: " + value; 
     } 
    } 

    private int privColumnID = 1; 
    public int ColumnID 
    { 
     get { return privColumnID; } 
     set 
     { 
      privColumnID = value; 
      LabelColumnNr.Content = "Column: " + value; 
     } 
    } 
    private int LineNumber() 
    { 
     TextPointer caretLineStart = RichTextControl.CaretPosition.GetLineStartPosition(0); 
     TextPointer p = RichTextControl.Document.ContentStart.GetLineStartPosition(0); 
     int currentLineNumber = 1; 

     while (true) 
     { 
      if (caretLineStart.CompareTo(p) < 0) 
      { 
       break; 
      } 
      int result; 
      p = p.GetLineStartPosition(1, out result); 
      if (result == 0) 
      { 
       break; 
      } 
      currentLineNumber++; 
     } 
     return currentLineNumber; 
    } 

    private int ColumnNumber() 
    { 
     TextPointer caretPos = RichTextControl.CaretPosition; 
     TextPointer p = RichTextControl.CaretPosition.GetLineStartPosition(0); 
     int currentColumnNumber = Math.Max(p.GetOffsetToPosition(caretPos) - 1, 0); 

     return currentColumnNumber; 
    } 
+0

Я хочу, чтобы связать это текстовое поле, и когда пользователь перемещает курсор/нажимает клавиши со стрелками вниз/вверх, размер строки должен меняться. Итак, когда я должен включать этот код, я имею в виду, какое событие следует обрабатывать? – savi

+0

Привет, Сави, я изменил код, который вам подходит. Если вы довольны кодом, пожалуйста, примите в качестве ответа – Sam1970

Смежные вопросы