Wpf Richtextbox选择的起始列和行号返回不同的值
本文关键字:返回 选择 Richtextbox Wpf | 更新日期: 2023-09-27 18:30:05
我正在初始化我的Richtextbox,
void InitRTBFlowDocument()
{
Style noSpaceStyle = new Style(typeof(Paragraph));
noSpaceStyle.Setters.Add(new Setter(Paragraph.MarginProperty, new Thickness(0)));
rtbTextEditor.Resources.Add(typeof(Paragraph), noSpaceStyle);
}
我想获取Richtext框中选择单词的行和列编号。我写的代码如下,第一次它是正确返回的。
void rtbTextEditor_SelectionChanged(object sender, RoutedEventArgs e)
{
//Get the richtext box selected text
Init.RTBSelectionText = rtbTextEditor.Selection.Text.Trim();
Init.SelectionText = rtbTextEditor.Selection.Text.Trim();
Init.isSelect = true;
if (Init.RTBSelectionText != string.Empty)
{
TextPointer tp = rtbTextEditor.Selection.Start.GetPositionAtOffset(-2, LogicalDirection.Forward);
if (tp != null)
GetStartingIndex();
}
Init.RTBContent = new TextRange(rtbTextEditor.Document.ContentStart, rtbTextEditor.Document.ContentEnd).Text;
}
void GetStartingIndex()
{
TextPointer tp1 = rtbTextEditor.Selection.Start.GetLineStartPosition(0);
TextPointer tp2 = rtbTextEditor.Selection.Start;
int SelectionColumnIndex = tp1.GetOffsetToPosition(tp2)-1;//column number
int someBigNumber = int.MaxValue;
int lineMoved;
rtbTextEditor.Selection.Start.GetLineStartPosition(-someBigNumber, out lineMoved); //Line number
int SelectionRowIndex = -lineMoved;
Init.RTBTextPoint = new RTBTextPointer();
Init.RTBTextPoint.Row = SelectionRowIndex;
Init.RTBTextPoint.Column = SelectionColumnIndex;
}
清除并添加新内容后,该位置返回错误的编号,
public void DisplayContent(string content)
{
//Clear the rich text box
rtbTextEditor.Document.Blocks.Clear();
rtbTextEditor.Document.Blocks.Add(new Paragraph(new Run(content)));
}
上面的代码中有荣的内容吗。请帮帮我提前感谢!
这是因为RTB中的内容不仅包含文本,还包含这些称为TextPointerContext的内容。TextPointer考虑到了这一点。您可以使用来检查TextPointer与什么相邻
TextPointer.GetPointerContext(LogicalDirection);
获取下一个文本指针:
TextPointer.GetNextContextPosition(LogicalDirection);
我在最近的一个项目中使用了一些示例代码,这确保了指针上下文的类型是Text:
while (start.GetPointerContext(LogicalDirection.Forward)
!= TextPointerContext.Text)
{
start = start.GetNextContextPosition(LogicalDirection.Forward);
if (start == null) return;
}
当您清除RTB时,您可能正在删除其中一些指针上下文。因此,使用GetPositionAtOffset()时要小心。这应该会给你一个指向正确方向的"指针"。如果你需要更多的帮助,我知道。
狩猎得好!