我想将插入符号4个位置移动到我的插入符号所在的位置。我已注册PreviewKeyDown
,并在捕获标签键时调用InsertTextInRun()
,如下所示:
private void rtb_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Tab)
{
rtb.CaretPosition.InsertTextInRun(" ");
e.Handled = true;
}
}
问题是,在致电InsertTextInRun()
后,插入符号保持不变。它不移动到新文本的末尾,这是我想要的行为。我该怎么做?
暂且不说 - 是的,我知道AcceptsTab
上的RichTextBox
属性。我选择忽略is并滚动我自己的标签功能,因为使用AcceptsTab
标签会对后续行缩进文字产生令人讨厌的副作用,这是不我想要的。
答案 0 :(得分:8)
我刚刚碰到同样的问题。似乎最终的插入位置取决于它在插入之前的移动方式。
以下代码确保(3.5sp1)插入后,光标将位于插入文本的右侧:
rtb.CaretPosition = rtb.CaretPosition.GetPositionAtOffset(0, LogicalDirection.Forward);
rtb.CaretPosition.InsertTextInRun(text);
请注意,插入符号的LogicalDirection属性可能(并且必须)由此更改;仅仅创建正确的TextPointer是不够的。
答案 1 :(得分:1)
在CaretPosition TextPointer上使用GetInsertionPosition()方法。这将允许您在插入符号之前插入文本。
private void rtb_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Tab)
{
rtb.CaretPosition.GetInsertionPosition(LogicalDirection.Backward).InsertTextInRun(" ");
e.Handled = true;
}
}
答案 2 :(得分:1)
要进行测试,您可以尝试自己强制移动:
rtb.CaretPosition = rtb.Document.ContentEnd;
如果可行,您可能必须在标签不在内容末尾的情况下实施其他逻辑。