WPF RichTextBox 输入光标和中文输入法问题

lihengupdate 2016-10-12 08:26:58
背景:我在RichTextBox控件的TextChanged事件里对录入的内容进行了处理,处理完后又重新
richTextBox.Document.Blocks.Add(phSource); Add到RichTextBox的Document里。
在这个过程中我遇到了两个比较头疼的问题
问题1:例如现在文本框里有:abc123yyyyyyy2 当我光标放在123后面进行输入的时候输入一个字符光标就自动跳到最后面的yyy2处了(因为我在TextChanged处理文本框里的内容然后又重新赋值了)问题是怎么能让光标在123后的位置输入新内容后光标还停留在输入内容的后面啊。以下是我TextChanged的代码。
private void richTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
this.richTextBox.TextChanged -= new TextChangedEventHandler(richTextBox_TextChanged);
TextPointer tpStart = richTextBox.CaretPosition;
//对文本框内容的处理函数
this.UpdateSourceContent(cbType.IsChecked == null ? true : cbType.IsChecked.Value);
this.richTextBox.TextChanged += new TextChangedEventHandler(richTextBox_TextChanged);
tpStart = tpStart.DocumentEnd;
richTextBox.CaretPosition = tpStart;
}
问题2:在当前输入法是中文输入法的时候打第一个字母就触发TextChanged事件了~正常吗?怎么不让他触发而是等某个汉字或词语打完到文本框时才触发呢


跪求大神解答~~~
...全文
306 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihengupdate 2016-10-13
  • 打赏
  • 举报
回复
引用 1 楼 Libby1984 的回复:
问题1:尽量不要在TextChanged里面去修改Text的内容,你的修改可能会再次出发TextChanged事件,可能会导致意外的问题。至于想要光标在上次输入的地方,很简单,在TextChanged的事件参数里面有Changes属性,一般取第一个元素,从里面可以获得发生改变的位置,然后根据AddLength或者RemoveLength确定是增加了还是减少了计算出当前光标的位置,然后用设置richtextbox.SelectionStar到这个位置就可以了。 问题2:这个应该是输入法的问题
引用 3 楼 Libby1984 的回复:
[quote=引用 2 楼 lihengupdate 的回复:] [quote=引用 1 楼 Libby1984 的回复:] 问题1:尽量不要在TextChanged里面去修改Text的内容,你的修改可能会再次出发TextChanged事件,可能会导致意外的问题。至于想要光标在上次输入的地方,很简单,在TextChanged的事件参数里面有Changes属性,一般取第一个元素,从里面可以获得发生改变的位置,然后根据AddLength或者RemoveLength确定是增加了还是减少了计算出当前光标的位置,然后用设置richtextbox.SelectionStar到这个位置就可以了。 问题2:这个应该是输入法的问题
Changes属性里第一个元素里面的addLength和RemoveLength我输入一个英文字符后值都是1怎么判定是输入了还是删除了呢?还有richtextBox.selection.start 是只读的你说的是不是用richTextBox.CaretPosition 这个属性赋值光标呢?赋值的对象是TextPointer 呢[/quote] 很奇怪你居然add和removee都有值,一般只有一个有值。你是不是同时删除和添加了,如果是这样的话就offset+add-remove就可以。设置位置你试试richTB.Selection.Select(pointer, pointer);这个函数.[/quote] 没有同时删除和添加 就是在英文输入法下去输入了一个英文字母A 有邮箱吗我把我的demo发给你帮我看一下~~同时也能看一下问题2是不是我输入法的问题~我觉得应该不是
  • 打赏
  • 举报
回复
引用 2 楼 lihengupdate 的回复:
[quote=引用 1 楼 Libby1984 的回复:] 问题1:尽量不要在TextChanged里面去修改Text的内容,你的修改可能会再次出发TextChanged事件,可能会导致意外的问题。至于想要光标在上次输入的地方,很简单,在TextChanged的事件参数里面有Changes属性,一般取第一个元素,从里面可以获得发生改变的位置,然后根据AddLength或者RemoveLength确定是增加了还是减少了计算出当前光标的位置,然后用设置richtextbox.SelectionStar到这个位置就可以了。 问题2:这个应该是输入法的问题
Changes属性里第一个元素里面的addLength和RemoveLength我输入一个英文字符后值都是1怎么判定是输入了还是删除了呢?还有richtextBox.selection.start 是只读的你说的是不是用richTextBox.CaretPosition 这个属性赋值光标呢?赋值的对象是TextPointer 呢[/quote] 很奇怪你居然add和removee都有值,一般只有一个有值。你是不是同时删除和添加了,如果是这样的话就offset+add-remove就可以。设置位置你试试richTB.Selection.Select(pointer, pointer);这个函数.
lihengupdate 2016-10-13
  • 打赏
  • 举报
回复
引用 1 楼 Libby1984 的回复:
问题1:尽量不要在TextChanged里面去修改Text的内容,你的修改可能会再次出发TextChanged事件,可能会导致意外的问题。至于想要光标在上次输入的地方,很简单,在TextChanged的事件参数里面有Changes属性,一般取第一个元素,从里面可以获得发生改变的位置,然后根据AddLength或者RemoveLength确定是增加了还是减少了计算出当前光标的位置,然后用设置richtextbox.SelectionStar到这个位置就可以了。
问题2:这个应该是输入法的问题


Changes属性里第一个元素里面的addLength和RemoveLength我输入一个英文字符后值都是1怎么判定是输入了还是删除了呢?还有richtextBox.selection.start 是只读的你说的是不是用richTextBox.CaretPosition 这个属性赋值光标呢?赋值的对象是TextPointer 呢
  • 打赏
  • 举报
回复
问题1:尽量不要在TextChanged里面去修改Text的内容,你的修改可能会再次出发TextChanged事件,可能会导致意外的问题。至于想要光标在上次输入的地方,很简单,在TextChanged的事件参数里面有Changes属性,一般取第一个元素,从里面可以获得发生改变的位置,然后根据AddLength或者RemoveLength确定是增加了还是减少了计算出当前光标的位置,然后用设置richtextbox.SelectionStar到这个位置就可以了。 问题2:这个应该是输入法的问题

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧