2015-12-08 3 views
1

Я использую встроенную проверку орфографии в WPF. Он работал очень хорошо, пока я не начал переходить на Windows 10 ... Я думаю, проблема заключается в том, что он используется для большого количества небольших текстовых полей. Мое приложение представляет сетку (TreeListView Telerik) с текстовыми полями для одного из столбцов, которые я хочу проверить. Мне нужно предоставить пользовательский словарь для проверки орфографии; единственный способ, которым я был в состоянии сделать это, чтобы подписаться на текстовое поле загружается событие и добавить пути в следующим образом:Проверка правописания в Win10 - Slow

 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 есть какой-то способ?

ответ

4

Начиная с .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 для получения дополнительной информации.

+0

ARGH, это гораздо сложнее, чем я надеялся; похоже, у меня впереди меня какое-то исследование :). Благодарим вас за информацию и подробное объяснение и ссылки, чтобы начать меня. – sfaust

+0

Дайте нам знать, как это происходит - esp, если вы не можете решить свою проблему. – Vatsan

6

Мы столкнулись с подобной проблемой и увидели улучшенную производительность, избегая повторной регистрации пользовательских словарей на каждом элементе управления TextBox во время загрузки.

К сожалению, мы сталкиваемся с еще одной проблемой с тем, как обрабатываются пользовательские словари, что также может привести к очень длительному времени загрузки, если у вас даже небольшое количество элементов управления TextBox.

Когда приложение WPF регистрирует пользовательский словарь в .NET 4.6.1 на Windows, 8,1/10, временный файл словаря создается в% LocalAppData% \ Temp и это регистрируется в стоимости MultiString _ GLOBAL _ в реестре ключ "Компьютер \ HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Правописание \ Словари".

Если значение _ GLOBAL _ заканчивается ссылкой на файл словаря, который не существует, приложение начинает проявлять очень медленную загрузку всякий раз, когда инициализируется элемент управления с проверкой орфографии.

Это может произойти с помощью кнопки «Остановить отладку» в Visual Studio, а затем запустить очистку диска или CCleaner после того, как прошло достаточно времени, чтобы удалить файлы словаря temp.

Мы смогли исправить это, очистив значение GLOBAL _ любых ссылок на файлы словаря, которых не было. Наше приложение начало работать, как ожидалось.

Мы подняли следующую соединять ошибку: https://connect.microsoft.com/VisualStudio/feedback/details/2153484

+0

Спасибо, я посмотрю. – sfaust

+0

Я думаю, что ты мой новый герой, мне жаль, что я не смог бы это сделать снова. Я не понял это в первый раз и все еще имел проблему, поэтому я подумал, что это не моя проблема. Однако после многократной отладки и расследования я вернулся сюда и сделал это правильно на этот раз, и он исправил это. СПАСИБО! – sfaust

Смежные вопросы