Win10中的拼写检查文本框 - 慢

Posted

技术标签:

【中文标题】Win10中的拼写检查文本框 - 慢【英文标题】:Spell check textbox in Win10 - Slow 【发布时间】:2016-03-14 01:21:09 【问题描述】:

我在 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); 

当然,这会为每个文本框调用 add,这似乎非常浪费,但它似乎工作得很好,几乎没有明显的延迟,而且只有在加载时。但是现在在 Windows 10 上,这似乎是一个荒谬的滞后。在我的 Windows 8.1 机器上,我加载了一个有几千行的文件,它会在大约 3 或 4 秒内出现;在我的 Windows 10 机器上,它会在大约 10-15 分钟内出现。如果我注释掉上述代码的自定义字典部分,它在任何一台机器上都会恢复到大约 3-4 秒。

有人知道更好的方法吗?或者如果在 Win10 中有一些解决方法?

【问题讨论】:

【参考方案1】:

从 .NET 4.6.1(Win8.1 & Win10)开始,WPF 使用 OS 公开的 ISpellChecker 接口来实现它的 SpellChecker,性能特征确实会有些不同。

值得注意的是,ISpellChecker 的自定义字典注册器在全球范围内起作用 - 它不再充当每个控件的注册。 (请参阅下面的知识库文章链接)。因此,为每个控件一遍又一遍地注册相同的字典集是一种浪费,并且可能会降低您的性能。此外,操作系统会在达到内部限制时开始忽略您的字典。

只需注册一次字典,或使用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 了解更多信息。

【讨论】:

啊,这比我希望的要复杂;看起来我前面有一些研究:)。感谢您提供的信息和详尽的解释以及帮助我​​入门的链接。 请告诉我们进展如何 - 特别是如果您无法解决问题。【参考方案2】:

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

不幸的是,我们在处理自定义字典的方式上遇到了另一个问题,即使您只有少量的 TextBox 控件,也会导致加载时间过长。

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

如果 _GLOBAL_ 值最终引用了一个不存在的字典文件,则每当初始化启用拼写检查的控件时,应用程序就会开始表现出非常缓慢的加载。

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

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

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

【讨论】:

谢谢,我会调查的。 我认为你是我的新英雄,我希望我能再次投票。我第一次没有做到这一点,但仍然有问题,所以我认为这不是我的问题。然而,经过大量调试和调查后,我最终回到了这里,这次做对了,它修复了它。谢谢!【参考方案3】:

首先,我想提一下,我知道这篇文章已经有几年的历史了,但我认为我的回答可能会帮助那些遇到同样问题但提出的解决方案不起作用的人(像我一样)。

为我解决的问题是将以下代码添加到 App.config

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Controls.DoNotAugmentWordBreakingUsingSpeller=true"/>
</runtime>

您也可以在 InitializeComponent() 调用之后插入以下代码

AppContext.SetSwitch(@"Switch.System.Windows.Controls.DoNotAugmentWordBreakingUsingSpeller", true);

Source 1 (XAML solution)Source 2 (C# solution)

【讨论】:

以上是关于Win10中的拼写检查文本框 - 慢的主要内容,如果未能解决你的问题,请参考以下文章

MindManager中的拼写检查功能如何用

MS Access 中的拼写检查 VBA 子程序已停止工作

在 IntelliJ IDEA 上禁用拼写检查

如何更改 Vim 拼写检查中的突出显示样式?

VS Code:启用内联拼写检查,但在“问题”面板中禁用拼写检查

如何禁用输入类型 = 文本的拼写检查?