[英]How To Set Caret Position At The End Of Current Line In A RichTextBox
我正在尝试将RichTextBox
的插入符号放置在当前行的.CaretPosition
属性与仅使用常规TextBox
的简单.CaretIndex
属性相比有很大的变化。
为了解决此问题,我制作了自己的用户控件,它只是一个RichTextBox
,它具有TextBox
大多数属性/方法,例如.LineCount
, .Text
, .CaretIndex
等。我制作了CaretIndex { get; set; }
CaretIndex { get; set; }
CaretIndex { get; set; }
用户控件中的属性如下所示:
public int CaretIndex
{
get
{
TextPointer start = display.Document.ContentStart;
TextPointer curPosition = display.CaretPosition;
TextRange range = new TextRange(start, curPosition);
return range.Text.Length;
}
set
{
display.CaretPosition = display.Document.ContentStart;
for (int i = 0; i < value; i++)
{
TextPointer move = display.CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward);
if (move != null)
display.CaretPosition = move;
}
}
}
get
方法似乎可以正常工作,但是set
并没有实现我预期的目标。 我的目标是使插入符号在逻辑上向前移动“值”的次数-值是我要移动的字符数-但是结果只是抽象的插入符号放置行为。 插入符号可以放到原行下方几行,或者一直到RichTextBox
的底部。
我想要的是一种简单的方法,可以在没有不确定行为的情况下左右移动插入符号。 我CaretIndex
以错误的方式访问我的CaretIndex
属性? 我对RichTextBox
的CaretPosition
属性有CaretPosition
吗? 有什么建议吗?
我制作了一个小型的wpf应用来测试您的代码-
XAML-
<Grid.RowDefinitions>
<RowDefinition Height="300"/>
<RowDefinition Height="100"/>
<RowDefinition Height="100"/>
</Grid.RowDefinitions>
<RichTextBox Grid.Row="0" Name="Rtb" />
<Button Grid.Row="1" Content="Get" Click="Button_Get" />
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="Set" Click="Button_Set" />
<TextBox Grid.Column="1" Name="DesiredPositionBox" />
</Grid>
C# -
public MainWindow()
{
InitializeComponent();
Rtb.AppendText("lineoftextlineoftextlineoftextlineoftext");
Rtb.AppendText(Environment.NewLine);
Rtb.AppendText("lineoftextlineoftextlineoftextlineoftext");
}
private void Button_Get(object sender, RoutedEventArgs e)
{
TextPointer start = Rtb.Document.ContentStart;
TextPointer curPosition = Rtb.CaretPosition;
TextRange range = new TextRange(start, curPosition);
Debug.WriteLine("Caret position : " + range.Text.Length);
Rtb.Focus();
}
private void Button_Set(object sender, RoutedEventArgs e)
{
int value = int.Parse(DesiredPositionBox.Text);
Rtb.CaretPosition = Rtb.Document.ContentStart;
for (int i = 0; i < value; i++)
{
TextPointer move = Rtb.CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward);
if (move != null)
Rtb.CaretPosition = move;
}
Rtb.Focus();
}
行Rtb.CaretPosition = Rtb.Document.ContentStart;
每次都将插入符号移到起始位置,因此,如果您输入'5',则插入符号将从RichTextBox的起始位置移至第5个字符。
删除Rtb.CaretPosition = Rtb.Document.ContentStart;
插入符号将从其原处移动x
位置。
编辑:还要回答如何将插入号放置在行的末尾,可以使用Rtb.CaretPosition.GetTextRunLength(LogicalDirection.Forward)
获取从插入号开始计算的第一个非文本符号之前的字符数(换行符恰好是)。
所以-
int value = Rtb.CaretPosition.GetTextRunLength(LogicalDirection.Forward);
TextPointer move = Rtb.CaretPosition.GetPositionAtOffset(value);
Rtb.CaretPosition = move;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.