WP8.1的TextBox.SelectionStart好像有Bug

tmp00000 UID.995403
2015-02-23 发表

在巨硬的论坛发没人理我,在这里再发一下。
我在Windows 8.1商店项目里新建了一个文本框,让它的AcceptReturn=True,Name=TxtRules

然后在它的TextChanged事件处理函数写了这个代码:

Debug.WriteLine("Total Length:" +TxtRules.Text.Length);
Debug.WriteLine("Current Selection Index:"+ TxtRules.SelectionStart);

运行程序,在文本框按一下回车,运行结果是

Total Length:2
Current Selection Index:1

按两次回车,结果是

Total Length:4
Current Selection Index:2

我感觉很奇怪,按回车产生了\r\n(或者说是vbCrLf),但是为什么SelectionStart是1而不是2?回车换行被当作一个字符了?

我新建了一个WPF项目,新建了个文本框,AcceptReturn=True,Name=TextBox1

也是在TextChanged写一样的代码

Debug.WriteLine("ToTal Length:" & TextBox1.Text.Length)
Debug.WriteLine("Current Selection Index:" & TextBox1.SelectionStart)

运行,在文本框按回车,结果却是

Total Length:2
Current Selection Index:2

这说明WPF的SelectionStart是正确的,认为\r\n是两个字符。

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
tmp00000 UID.995403
2015-02-23 回复

巨硬的技术支持要RMB的,我开发免费软件自己出钱太不值得了

zcxsythenew UID.911687
2015-02-23 回复

刚刚开电脑看了一下,text真的是\r\n。可能Selection不把\r放在眼里

tmp00000 UID.995403
2015-02-23 回复

Quote***链接停止解析***
刚刚开电脑看了一下,text真的是\r\n。可能Selection不把\r放在眼里


那我就遇到大麻烦了。我想实现取词功能,点到一个词后结果取的词偏到上面去了,这怎么解决?

zcxsythenew UID.911687
2015-02-23 回复

Quotetmp00000 发表于 2015-2-23 12:10
那我就遇到大麻烦了。我想实现取词功能,点到一个词后结果取的词偏到上面去了,这怎么解决? ...


应该有 SelectedText 吧?

tmp00000 UID.995403
2015-02-23 回复

Quote***链接停止解析***
应该有 SelectedText 吧?


有是有,但是得把词完全选中SelectedText才能取词。我想直接点光标取词。

zcxsythenew UID.911687
2015-02-23 回复

Quotetmp00000 发表于 2015-2-23 12:15
有是有,但是得把词完全选中SelectedText才能取词。我想直接点光标取词。


建议你发一个***链接停止解析***看看。

tmp00000 UID.995403
2015-02-23 回复

Quote***链接停止解析***
建议你发一个Support看看。


那个是收费的

tmp00000 UID.995403
2015-02-23 回复

Quote***链接停止解析***
建议你发一个Support看看。


微软的论坛开始有人测试了。等待答复中。

zcxsythenew UID.911687
2015-02-23 回复

Quote***链接停止解析***
那个是收费的


收费的?我还找过它解决了一次问题,不过那是微软商店自己的问题。

tmp00000 UID.995403
2015-02-23 回复

Quote***链接停止解析***
收费的?我还找过它解决了一次问题,不过那是微软商店自己的问题。


今天登录的时候提示我选择支付方式,然后我就退出了

qiqiminmin UID.638527
2015-02-23 回复

本帖最后由 qiqiminmin 于 2015-2-23 23:11 编辑

hehe,您发现的这个倒是蛮有意思的。 不会实际处理中,可能你就要Trim一下了。或用正则表达式验证,

qiqiminmin UID.638527
2015-02-23 回复

本帖最后由 qiqiminmin 于 2015-2-24 09:58 编辑

Quote***链接停止解析***
那我就遇到大麻烦了。我想实现取词功能,点到一个词后结果取的词偏到上面去了,这怎么解决? ...


你不应该纠结于这个回车,你可以自己输入一段文字,夹杂回车,看看能不能选取到你想要的问题就行了。

还有就是你要区分

TextChanged 和 SelectTextChanged, 如果你像获得text,那么用TextChanged, split('\n'),获得string[], 然后每个 string.Trim(), '\r'就不会有任何影响。

如果是SelectTextChanged,每次都可以正常得到你想要的选择 string的.

private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
{
string text = (sender as TextBox).SelectedText;

}

tmp00000 UID.995403
2015-02-24 回复

Quote***链接停止解析***
你不应该纠结于这个回车,你可以自己输入一段文字,夹杂回车,看看能不能选取到你想要的问题就行了。

还 ...


我用TextChanged只是测试SelectionStart。
取词代码在SelectionChanged里面。
用SelectedText不能解决我的问题,因为选择的词可能不全,或者SelectionLength为0

tmp00000 UID.995403
2015-02-24 回复

Quote***链接停止解析***
hehe,您发现的这个倒是蛮有意思的。 不会实际处理中,可能你就要Trim一下了。或用正则表达式验证, ...


正则用不成,因为无法获取正确的选择的位置

tmp00000 UID.995403
2015-02-24 回复

Quote***链接停止解析***
你不应该纠结于这个回车,你可以自己输入一段文字,夹杂回车,看看能不能选取到你想要的问题就行了。

还 ...


要是文本就一行,那不会出错,但是每多一行文本获取到的SelectionStart就会向左错位1,要是有一段长的多行文本,后面会偏非常多,根本无法正确取词。

qiqiminmin UID.638527
2015-02-24 回复

本帖最后由 qiqiminmin 于 2015-2-24 20:55 编辑

Quote***链接停止解析***
要是文本就一行,那不会出错,但是每多一行文本获取到的SelectionStart就会向左错位1,要是有一段长的多 ...


第一: 不存在正则表达式找不到词的说法。只能说你不太会用
第二: 不存在文本多行就找不到的说法,所以我多次强调你用多行多次用selectTextChanged测试,没有人用selectIndex,如果用的时候,也应该是出现选择的情况下,出现选择的情况是有一截深颜色,要不selectlength就是0.

还有特别注意的是,我并不是跟你说selectionStart对不对,明显是不对的,但是你不是问怎么处理吗?我这个例子,你就不会出现错位的,如果只是想得到选择的词。如果还不行,可能就要强行将\r\n转换为\n

例子:这里是我做的例子,如果选择了,最下面的TextBlock就会找出所在的词(我的Textbox接受回车)
***附件停止解析***
***附件停止解析***

再截图,你会清楚点
***附件停止解析***
如图,选择的词是 "Hello",
SelectionStart = 1,
SelectionLength = 5,
Text = "\r\nHello\r\nWord"
如果用 textbox.Text.SubString(1,5),肯定是错的,
如果你直接用 textbox.SelectText,那么就是对的。这个是微软错了

tmp00000 UID.995403
2015-02-24 回复

Quote***链接停止解析***
第一: 不存在正则表达式找不到词的说法。只能说你不太会用
第二: 不存在文本多行就找不到的说法,所以 ...


我的意思是把选择的起始位置移动到词的内部时我用自己的算法取词,不是要用SelectedText取词。这样可以一边输入一遍取词。

qiqiminmin UID.638527
2015-02-24 回复

本帖最后由 qiqiminmin 于 2015-2-24 23:37 编辑

Quote***链接停止解析***
我的意思是把选择的起始位置移动到词的内部时我用自己的算法取词,不是要用SelectedText取词。这样可以一 ...


目前你想用wp8.1实现你的功能就加这句。 var text = System.Text.RegularExpressions.Regex.Replace((sender as TextBlock).Text, "\r\n", "\n");
selectIndex就是忽略了\r,以后你自己弄得话,也要事先转为\n

不过你确实发现了一个bug,这是个bug.但是你想自己实现自己的功能,有很多办法可以实现的。Textbox选择时忽略了\r

tmp00000 UID.995403
2015-02-25 回复

Quoteqiqiminmin 发表于 2015-2-24 23:32
目前你想用wp8.1实现你的功能就加这句。 var text = System.Text.RegularExpressions.Regex.Replace((sen ...


这会带来较大的性能问题。我的程序要处理接近2mb的文本,不管是用String的替换还是正则(我还没用过正则替换)都不可避免地复制很多内存。速度比较快的办法是用StringBuilder去除Cr。

这样确实绕过了bug,感谢你提供绕过的办法。

tmp00000 UID.995403
2015-02-25 回复

Quoteqiqiminmin 发表于 2015-2-24 23:32
目前你想用wp8.1实现你的功能就加这句。 var text = System.Text.RegularExpressions.Regex.Replace((sen ...


其实textbox的bug不止这些。向里面粘贴较多文本会引发一个非托管的未处理的异常。不知道微软是怎么搞的,那么多bug。

qiqiminmin UID.638527
2015-02-25 回复

Quote***链接停止解析***
这会带来较大的性能问题。我的程序要处理接近2mb的文本,不管是用String的替换还是正则(我还没用过正则 ...


还有textbox显示不能超过像素1024,你也需要自己处理的.

我之前也处理过10m左右的文档。 最快的是正则表达式发现match的位置。

tmp00000 UID.995403
2015-02-26 回复

Quote***链接停止解析***
还有textbox显示不能超过像素1024,你也需要自己处理的.

我之前也处理过10m左右的文档。 最快的是正则表 ...


粘贴导致溢出崩溃的bug现在不知道怎么解决了。
还是禁止粘贴比较安全,否则别人往我的程序粘贴一下有可能执行恶意代码。

qiqiminmin UID.638527
2015-02-26 回复

本帖最后由 qiqiminmin 于 2015-2-26 20:42 编辑

Quote***链接停止解析***
粘贴导致溢出崩溃的bug现在不知道怎么解决了。
还是禁止粘贴比较安全,否则别人往我的程序粘贴一下有可能 ...


你首先也对粘贴text实现去处理,去测量这些text在你的textbox里面会有多少行。

代码不需要担心,也只有在 url,或者网页上输入地址才有可能被植入代码。 一般实现进行编码例如: var urltext = system.net.webuliity.urlencode(text); 这样进行编码之后都会无害,至于textbox,你是不需要担心的。

tmp00000 UID.995403
2015-03-02 回复

Quote***链接停止解析***
你首先也对粘贴text实现去处理,去测量这些text在你的textbox里面会有多少行。

代码不需要担心,也只有 ...


粘贴的字划分成好几段,清空文本框,AppendText。。。。。。估计会被喷性能渣。

Silens UID.535314
2015-03-11 回复

Quote***链接停止解析***
第一: 不存在正则表达式找不到词的说法。只能说你不太会用
第二: 不存在文本多行就找不到的说法,所以 ...


高端玩家 这么详细的解释。。。。 调试的截图都给你了!还看不懂?

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报