Win10中的拼写复选框-慢速
本文关键字:复选框 慢速 Win10 | 更新日期: 2023-09-27 18:26:08
我在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中是否有办法绕过它?
我们也遇到过类似的问题,通过避免在加载期间在每个TextBox控件上重新注册自定义字典,我们看到了性能的提高。
不幸的是,我们在处理自定义词典的方式上遇到了另一个问题,如果您只有少量的TextBox控件,这也可能导致加载时间过长。
当WPF应用程序在Windows 8.1/10上的.NET 4.6.1中注册自定义词典时,会在%localappdata%''Temp中创建一个临时词典文件,并将其注册在多环值;全局&95;在注册表项"Computer''HKEY_CURRENT_USER''Software''Microsoft''Spelling''DDictionaries"中。
如果_;全局&95;值最终引用了一个不存在的字典文件,每当初始化启用拼写检查的控件时,应用程序的加载就会开始非常缓慢。
这可以通过在Visual Studio中使用"停止调试"按钮,然后在经过足够的时间后运行磁盘清理或CCleaner来删除临时字典文件来实现。
我们通过清除_;全局&95;指向不存在的词典文件的任何链接的值。我们的应用程序开始按预期工作。
我们引发了以下连接错误:https://connect.microsoft.com/VisualStudio/feedback/details/2153484
在启动.NET 4.6.1(在Win8.1和Win10中)时,WPF使用操作系统公开的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以获取更多信息。
首先,我想说的是,我知道这篇文章已经发布了几年,但我认为我的答案可能会帮助那些有同样问题但所提供的解决方案不起作用的人(比如我自己)
对我来说,修复它的是将以下代码添加到App.config:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.DoNotAugmentWordBreakingUsingSpeller=true"/>
</runtime>
或者,您也可以在InitializeComponent()调用后插入以下代码:
AppContext.SetSwitch(@"Switch.System.Windows.Controls.DoNotAugmentWordBreakingUsingSpeller", true);
源1(XAML解决方案)
来源2(C#解决方案)