2013-08-01 17 views
5

Sto eseguendo il porting di un'applicazione da WinForms a WPF e ho riscontrato un problema durante il tentativo di ottenere il numero di riga e di colonna per il punto in cui la selezione si trova nella casella di testo. Sono riuscito a farlo abbastanza semplicemente in WinForms, ma WPF ha un modo completamente diverso di implementare un RichTextBox quindi non ho idea di come procedere.C# WPF Numero riga e colonna da RichTextBox

Ecco la mia soluzione WinForms

int line = richTextBox.GetLineFromCharIndex(TextBox.SelectionStart); 
int column = richTextBox.SelectionStart - TextBox.GetFirstCharIndexFromLine(line); 

LineColumnLabel.Text = "Line " + (line + 1) + ", Column " + (column + 1); 

Ciò non funzionerà con WPF, perché non è possibile ottenere l'indice della selezione corrente.

ecco la soluzione LAVORO:

int lineNumber; 
textBox.CaretPosition.GetLineStartPosition(-int.MaxValue, out lineNumber); 
int columnNumber = richTextBox.CaretPosition.GetLineStartposition(0).GetOffsetToPosition(richTextBox.CaretPosition); 
if (lineNumber == 0) 
    columnNumber--; 

statusBarLineColumn.Content = string.Format("Line {0}, Column {1}", -lineNumber + 1, columnNumber + 1); 
+0

Hai provato qualcosa, per dire come è completamente diverso? –

+0

Probabilmente correlati: http://stackoverflow.com/questions/957441/richtextbox-wpf-does-not-have-string-property-text?rq=1 –

+0

Avrai bisogno di cercare le dipendenze ma, questo non è un compito facile. Ho dato un'occhiata a questo, ho visto quanto lavoro era necessario (o almeno quanto avevo bisogno di imparare) e ho cambiato le specifiche del prodotto in modo da evitarlo! Potrebbe essere meglio cercare una terza parte se il tempo è essenziale per il tuo progetto. – Dave

risposta

7

Qualcosa del genere può dare un punto di partenza.

TextPointer tp1 = rtb.Selection.Start.GetLineStartPosition(0); 
TextPointer tp2 = rtb.Selection.Start; 

int column = tp1.GetOffsetToPosition(tp2); 

int someBigNumber = int.MaxValue; 
int lineMoved, currentLineNumber; 
rtb.Selection.Start.GetLineStartPosition(-someBigNumber, out lineMoved); 
currentLineNumber = -lineMoved; 

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

Un paio di cose da notare. La prima riga sarà la linea 0, quindi potresti voler aggiungere un + 1 al numero di linea. Anche se una linea avvolge la sua colonna iniziale sarà 0 ma la prima riga e qualsiasi linea che segue un CR elencherà la posizione iniziale come colonna 1.

+1

Grazie! La tua risposta mi è stata di grande aiuto. Ho dovuto fare una piccola cosa che era meno 1 della colonna se il numero della linea era 1. Ho intenzione di pubblicare la mia soluzione di lavoro –