2013-08-01 52 views
5

WinFormsからWPFへアプリケーションを移植していますが、テキストボックスに選択範囲の行番号と列番号を取得しようとしています。私はWinFormsで非常に単純に行うことができましたが、WPFはRichTextBoxを実装する全く異なる方法を持っていますので、どうやってそれをどうやって進めるのか分かりません。ここでc#WPFのリッチテキストボックスの行番号と列番号

は私のWinFormsソリューションを使用すると、現在の選択の指標を得ることができないので、これはWPFでは動作しません

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

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

です。 HERE

はWORKINGソリューションです:このような

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

2つの注意点があります。最初の行は0行目になりますので、行番号に+ 1を追加できます。また、行の最初の列は0になりますが、最初の行とCRに続く行は最初の位置を列1としてリストします。

+1

ありがとうございました!あなたの答えは本当に助けになりました。行番号が1の場合は、列からマイナス1の小さな事をしなければなりませんでした。 –