我有一个针对.NET 4.5.2的WPF应用程序(但通常在4.6.1下运行),并且我已经对几个TextBox和DataGridTextColumns启用了拼写检查。根据用户选择的语言(我们目前仅支持en),通过样式启用拼写检查。应用程序和系统文化都设置为en或en-US。我没有使用任何自定义词典。
通过以下样式启用拼写检查:
<Style TargetType="TextBox">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Source={x:Static Properties:Settings.Default}, Path=Culture}"
Value="en" />
<Condition Binding="{Binding Source={x:Static diagnostics:Debugger.IsAttached}}"
Value="False" />
</MultiDataTrigger.Conditions>
<Setter Property="SpellCheck.IsEnabled"
Value="True" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
(我们使用内置的ApplicationSettings对象存储最后选择的应用程序文化,并且仅保存最通用的父文化。如果用户的系统设置为&#34; en-US&#34;,我们只是存储&#34; en&#34;以简化事情。)
TextBox是在用于TreeViewItems的DataTemplate中定义的,以防万一。用户更可能编辑TextBox而不是DataGrid,因此我怀疑该问题与TextBox有关。
在Windows 8和10上,某些用户在拼写检查程序中遇到崩溃,其中包含以下堆栈跟踪:
System.ObjectDisposedException: Safe handle has been closed
at System.Threading.WaitHandle.WaitOneNative(SafeHandle waitableSafeHandle, UInt32 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
at System.Threading.WaitHandle.InternalWaitOne(SafeHandle waitableSafeHandle, Int64 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
at System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout, Boolean exitContext)
at System.Windows.Documents.WinRTSpellerInterop.ClearDictionaries(Boolean isDisposeOrFinalize)
at System.Windows.Documents.WinRTSpellerInterop.Dispose(Boolean disposing)
at System.Windows.Documents.WinRTSpellerInterop.Finalize()
我搜索了Google,StackOverflow和MSDN,但无法找到对此问题的任何引用。我不知道我的用户正在做什么来触发这个案例,我自己也无法重现它。我的日志表明,当发生这种情况时,他们没有编辑启用拼写检查的字段(实际上,他们所做的最后一次编辑至少是异常前一分钟或2分钟)。有没有人有任何想法?
答案 0 :(得分:0)
此问题已在.NET 4.7中解决(请参阅&#34; WPF拼写检查程序&#34; Runtime Changes页面上的条目)。请注意,NET 4.7将不会安装在Windows 10 11月更新或更早版本上。但是,大多数Windows 10用户现在应该已经参加了周年纪念更新。
从.NET Framework 4.6.1开始,WPF应用程序中的拼写检查程序偶尔会在应用程序关闭期间抛出ObjectDisposedException。
在.NET Framework 4.7中,运行时正常处理异常,从而确保应用程序不再受到不利影响。应该注意的是,在调试器下运行的应用程序中偶尔会出现偶然的第一次机会异常。