WPF 中 RichTextBox 内的光标位置
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/24420235/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Cursor position inside a RichTextBox in WPF
提问by savi
I am developing a small WPF application, which has multiple tabs in it. I have a status bar in the bottom; the requirement is to show linenumber and column of the cursor. So when the user changes the cursor position, linenumber and column has to get updated automatically. Here is the code where I add RichTextBox; the code which calculates the linenumber and column is in the KeyDown event handler, but this event never gets called. Which event should I handle to get the cursor linenumber and column?
我正在开发一个小型 WPF 应用程序,其中有多个选项卡。我在底部有一个状态栏;要求是显示光标的行号和列。因此,当用户更改光标位置时,行号和列必须自动更新。这是我添加 RichTextBox 的代码;计算行号和列的代码在 KeyDown 事件处理程序中,但这个事件永远不会被调用。我应该处理哪个事件来获取光标行号和列?
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();
}
回答by Alexander Bell
There is a standard example to your task at MSDN (http://msdn.microsoft.com/en-us/library/system.windows.controls.richtextbox.caretposition%28v=vs.110%29.aspx). Please note, that in this context 'cursor' is called a 'caret'. Sample from MSDN follows:
在 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;
回答by Sam1970
use this code to find Line and position
使用此代码查找行和位置
WPF
WPF
"<Label x:Name="LabellineNr" Content="line#" BorderThickness="1" BorderBrush="DarkGray" />
"<Label x:Name="LabelColumnNr" Content="Column#" BorderThickness="1" BorderBrush="DarkGray"/>
C# code
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;
}

