在Win10中拼写检查文本框 – 慢

我在WPF中使用内置的拼写检查程序。 它工作得很好,直到我让用户开始升级到Windows 10 …我认为问题是它被用于许多小文本框。 我的应用程序提供了一个网格(Telerik的TreeListView),其中包含我希望拼写检查的其中一列的文本框。 我需要能够为拼写检查器提供自定义词典; 我能够做到这一点的唯一方法是订阅文本框加载的事件并添加路径如下:

TextBox tb = sender as TextBox; tb.ContextMenu = ctx_Spell; IList dcts = SpellCheck.GetCustomDictionaries(tb); dictsList.Add(dcts); if (KMApplication.Settings.UserDictionary != null) { dcts.Add(KMApplication.Settings.UserDictionary); } foreach (Uri dct in KMApplication.Settings.RevitDictonaries) { dcts.Add(dct); } 

当然,这称为每个文本框的添加,这看起来非常浪费,但它似乎工作得很好,几乎没有明显的滞后,只有加载。 但是现在在Windows 10上似乎是一个荒谬的滞后。 在我的Windows 8.1机器上,我加载了几千行的文件,它出现在大约3或4秒内; 在我的Windows 10盒子上,它出现在大约10-15分钟。 如果我注释掉上面代码的自定义词典部分,那么它在任何一台机器上都会恢复大约3-4秒。

有谁知道更好的方法吗? 或者如果在Win10中有某种方法?

从.NET 4.6.1开始(在Win8.1和Win10中),WPF使用操作系统公开的ISpellChecker接口来实现其SpellChecker,性能特征确实有些不同。

值得注意的是,ISpellChecker的自定义词典注册器在全球范围内起作用 – 它不再作为每个控件的注册。 (参见下面的KB文章链接)。 因此,为每个控件反复注册同一组字典是浪费的,并且可能会降低您的性能。 此外,当操作系统达到内部限制时,它将开始忽略您的词典。

只需注册字典一次,或使用http://blogs.msdn.com/b/wpf/archive/2015/10/29/wpf-in-net-4-6-1.aspx上列出的替代注册机制,将文件放在%appdata%\ microsoft \ spelling \下。

如果您需要在Win7 / Win8以及Win8.1 / Win10上运行相同的应用程序,您可能需要检测操作系统并分支您的字典注册策略。

通常,自定义词典的典型用法应该像往常一样继续工作 – .NET 4.6.1与以前的版本之间几乎没有区别。

有关其他信息,另请参阅https://support.microsoft.com/en-us/kb/3088234 。

我们遇到了类似的问题,并且通过避免在加载期间在每个TextBox控件上重新注册自定义词典来提高性能。

不幸的是,我们遇到了处理自定义词典的方式的另一个问题,如果你甚至有少量的TextBox控件,也可能导致非常长的加载时间。

当WPF应用程序在Windows 8.1 / 10上的.NET 4.6.1中注册自定义词典时,会在%localappdata%\ Temp中创建一个临时词典文件,并在注册表项“Computer \ HKEY_CURRENT_USER”中的多字符串值_GLOBAL_中注册软件\微软\拼写\字典”。

如果_GLOBAL_值最终引用不存在的字典文件,则只要初始化启用了拼写检查的控件,应用程序就会开始显示非常慢的加载。

这可以通过使用Visual Studio中的“停止调试”按钮,然后在经过足够的时间运行磁盘清理或CCleaner来删除临时字典文件后发生。

我们设法通过清除任何不存在的字典文件的链接的_GLOBAL_值来解决这个问题。 我们的应用程序开始按预期工作。

我们提出了以下连接错误: https : //connect.microsoft.com/VisualStudio/feedback/details/2153484