2013-08-01 13 views
5

Przenoszę aplikację z WinForms do WPF i uderzyłem w przeszkodę, próbując uzyskać wiersz i numer kolumny dla miejsca, w którym zaznaczenie znajduje się w polu tekstowym. Udało mi się to zrobić po prostu w WinForms, ale WPF ma zupełnie inny sposób implementacji RichTextBox, więc nie mam pojęcia, jak to zrobić.C# Wiersz WPF i kolumna z RichTextBox

Oto moje WinForms rozwiązanie

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

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

To nie będzie działać z WPF, ponieważ nie można uzyskać indeks bieżącego zaznaczenia.

Oto roztwór roboczy:

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

Czy próbowałeś czegoś, aby powiedzieć, jak to jest zupełnie inaczej? –

+0

Prawdopodobnie powiązane: http://stackoverflow.com/questions/957441/richtextbox-wpf-does-not-have-string-property-text?rq=1 –

+0

Będziesz musiał sprawdzić zależności, ale to nie jest łatwe zadanie. Przyjrzałem się temu, widziałem, ile pracy było potrzebne (lub przynajmniej ile potrzebowałem się uczyć) i zmieniłem specyfikację produktu, aby uniknąć tego! Być może najlepiej poszukasz osoby trzeciej, jeśli czas jest niezbędny dla twojego projektu. – Dave

Odpowiedz

7

Coś takiego może dać punkt wyjścia.

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

Kilka rzeczy do zapamiętania. Pierwsza linia będzie linią 0, więc możesz dodać + 1 do numeru linii. Również jeśli linia zawinie się, jej początkowa kolumna będzie wynosić 0, ale pierwsza linia i jakakolwiek linia następująca po CR wskaże początkową pozycję jako kolumna 1.

+1

Dzięki! Twoja odpowiedź naprawdę pomogła. Musiałem wykonać jedną małą rzecz, która była minus 1 z kolumny, jeśli numer wiersza wynosił 1. Zamierzam opublikować moje rozwiązanie robocze –

Powiązane problemy