2013-08-01 47 views
5

我將一個應用程序從WinForms移植到WPF,我試圖獲取行和列號,以便在文本框中進行選擇。我能夠在WinForms中簡單地完成它,但WPF有一個完全不同的方式來實現RichTextBox,所以我不知道如何去做。c#WPF行和列號從RichTextBox

這裏是我的WinForms的解決方案

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

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

這不會WPF工作,因爲你不能讓當前選擇的索引。

這裏是工作的解決方案:

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

您嘗試過某種方式,以說明它與完全不同嗎? –

+0

可能相關:http://stackoverflow.com/questions/957441/richtextbox-wpf-does-not-have-string-property-text?rq=1 –

+0

你需要查找依賴關係,但是,這不是簡單的任務。我仔細研究了這一點,看到需要多少工作(或者至少需要多少工作才能學習),並更改了我的產品規格,以便我可以避免它!如果時間對您的項目至關重要,您可能最好尋找第三方。 – Dave

回答

7

像這樣的東西可能會給你一個起點。

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

一些事情要注意。第一行將是第0行,因此您可能需要向行號添加+1。另外,如果一行換行,其最初的列將爲0,但第一行和CR後面的任何行將列出初始位置爲第1列。

+1

謝謝!你的回答真的有幫助,如果行號是1,我必須做一個從列中減1的小東西。我將發佈我的工作解決方案 –