HandyControl icon indicating copy to clipboard operation
HandyControl copied to clipboard

AutoCompleteTextBox 中文输入会崩溃

Open GlodenBoy opened this issue 2 years ago • 9 comments

Describe the bug

使用AutoCompleteTextBox 时,输入中文时程序崩溃。

Steps to reproduce the bug

在Demo测试也必现

Expected behavior

No response

Screenshots

image

NuGet package version

HandyControl 3.3.0

IDE

Visual Studio 2019

Framework type

.Net 5.0

Windows version

May 2021 Update (19043)

Additional context

No response

GlodenBoy avatar Apr 12 '22 07:04 GlodenBoy

仔细测试了一下,用非微软的输入法会崩溃,微软自带的输入法无问题

GlodenBoy avatar Apr 12 '22 08:04 GlodenBoy

二测之后,发现单独使用TextBox就不会出问题,只有在使用AutoComplete 的 TextBox会崩溃,应该是代码写法上的不兼容 @NaBian

GlodenBoy avatar Apr 12 '22 09:04 GlodenBoy

能否提供有关的堆栈信息?

NaBian avatar Apr 17 '22 13:04 NaBian

没有办法try ,全局也没有截住,我是用的rider,自动反编译后 崩溃到了, MS.Internal.Invariant

image

老哥你可以直接调试handyOrg的 Demo 的 AutoCompleteTextBox 那项,使用三方输入法,中文输入同样会崩溃。

网上有相关WPF 三方输入法崩溃的信息,但是都没有提到解决办法,我只是奇怪的是 我只单独用Textbox却是 不会崩溃,应该有办法闭规?

@NaBian

GlodenBoy avatar Apr 18 '22 03:04 GlodenBoy

一样的问题,在官方demo下,自动补全文本框,输入中文,在QQ输入法下会出现,一直点击一个字母即可复现。搜狗输入法不会。 看两者的表现我推测原因是这样,搜狗输入法的时候输入的中间字母是在搜狗输入法的控件上,而QQ输入法是在自动补全框这个控件上,应该和这个有一些关系。

image 企业微信截图_16506342427503

搜狗输入法中间状态

image

QQ输入法中间状态

image

annpeter avatar Apr 22 '22 14:04 annpeter

一样的问题,在官方demo下,自动补全文本框,输入中文,在QQ输入法下会出现,一直点击一个字母即可复现。搜狗输入法不会。 看两者的表现我推测原因是这样,搜狗输入法的时候输入的中间字母是在搜狗输入法的控件上,而QQ输入法是在自动补全框这个控件上,应该和这个有一些关系。

自带的TextBox不会有问题,应该是封装后导致的

GlodenBoy avatar Apr 26 '22 13:04 GlodenBoy

我最近也在追一个 IME 问题,感觉和这个是完全不同的两个问题,但可以参考一下。没有解决的方法,只是记录一下问题

https://github.com/dotnet/wpf/issues/6463

lindexi avatar Jun 13 '22 00:06 lindexi

可以确定基本上是SetCurrentValue(IsDropDownOpenProperty, ValueBoxes.TrueBox);这句导致的报错,因为注释掉这句出现的2个地方就不会报异常,至于异常原因,我怀疑可能和IsDropDownOpen内部的一些操作有关系,他注册了2个函数,至于解决方案,可以定义一个IsDropDownOpen2的依赖属性,然后把popup的IsOpen绑定到IsDropDownOpen2上面,经过测试不会再出现异常。

zixing131 avatar Oct 07 '22 08:10 zixing131

在AutoCompleteTextBox.cs中加入这两句可以暂时解决这个问题

public new static readonly DependencyProperty IsDropDownOpenProperty = DependencyProperty.Register("IsDropDownOpen", typeof(bool), typeof(ComboBox), new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public new bool IsDropDownOpen { get { return (bool) GetValue(IsDropDownOpenProperty); } set { SetValue(IsDropDownOpenProperty, ValueBoxes.BooleanBox(value)); } }

zixing131 avatar Oct 10 '22 06:10 zixing131