我有一个针对.NET 4.5.2(但通常在4.6.1下运行)的WPF应用程序,并且已经在几个TextBoxes和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对象存储最后选择的应用程序区域性,并且仅保存最通用的父区域性。如果用户的系统设置为“ en-US”,我们将仅存储“ en”以简化操作。) )

如果有任何区别,则在用于TreeViewItems的DataTemplate中定义TextBox。用户更有可能编辑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,但找不到与此问题有关的任何参考。我不知道我的用户正在采取什么措施来触发此案件,因此我无法自己复制该案件。我的日志表明,发生这种情况时,他们没有在编辑启用了拼写检查的字段(实际上,他们上次进行的编辑至少是在异常发生前一分钟或两分钟)。有人有什么想法吗?

最佳答案

.NET 4.7中已解决此问题(请参见Runtime Changes页上的“ WPF Spellchecker”条目)。请注意,NET 4.7不会安装在Windows 10 November Update或更早版本上。但是,大多数Windows 10用户现在应该已经在周年更新中。


  从.NET Framework 4.6.1开始,WPF应用程序中的拼写检查器有时会在应用程序关闭期间引发ObjectDisposedException。
  
  在.NET Framework 4.7中,运行时可以很好地处理异常,从而确保应用程序不再受到不利影响。应该注意的是,在调试器下运行的应用程序中仍然偶尔会出现偶然的例外情况。

关于c# - WPF拼写检查终结器-安全处理已关闭,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37705309/

10-12 17:04