c# wpf textbox windows-10 spell-checking

c# - Casilla de verificación de ortografía en Win10-Lento



wpf textbox (2)

Estoy usando el corrector ortográfico incorporado en WPF. Funcionó perfectamente hasta que los usuarios comenzaron a actualizar a Windows 10 ... Creo que el problema es que se está utilizando para muchos cuadros de texto pequeños. Mi aplicación presenta una grilla (TreeListView de Telerik) con cuadros de texto para una de las columnas que quiero revisar con ortografía. Necesito poder proporcionar un diccionario personalizado al corrector ortográfico; la única forma en que pude hacer esto fue suscribiéndome al evento textbox loaded y agregué las rutas de la siguiente manera:

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); }

Por supuesto, esto llama el complemento para cada cuadro de texto que parece terriblemente inútil, pero parecía estar funcionando bien con poco retraso notable y solo en la carga. Sin embargo, ahora en Windows 10 parece ser un retraso ridículo. En mi máquina con Windows 8.1 cargué un archivo con miles de filas y aparece en aproximadamente 3 o 4 segundos; en mi caja de Windows 10, aparece en unos 10-15 minutos. Si hago un comentario sobre la porción de diccionarios personalizados del código anterior, volveré a estar alrededor de 3-4 segundos en cualquiera de las máquinas.

¿Alguien sabe una mejor manera de hacer esto? O si hay alguna forma de evitarlo en Win10?


Iniciando .NET 4.6.1 (en Win8.1 y Win10), WPF usa la interfaz ISpellChecker expuesta por el sistema operativo para implementar su SpellChecker, y las características de rendimiento podrían ser algo diferentes.

Notablemente, el registrador de diccionarios personalizado de ISpellChecker actúa globalmente, ya no actúa como un registro por control. (Ver el enlace del artículo de KB a continuación). Como resultado, registrar el mismo conjunto de diccionarios una y otra vez para cada control es un desperdicio y puede potencialmente degradar su rendimiento. Además, el sistema operativo comenzará a ignorar tus diccionarios cuando alcance un límite interno.

Simplemente registre los diccionarios una vez, o use el mecanismo de registro alternativo descrito en http://blogs.msdn.com/b/wpf/archive/2015/10/29/wpf-in-net-4-6-1.aspx y coloque los archivos debajo de% appdata% / microsoft / spelling /.

Si necesita ejecutar la misma aplicación en Win7 / Win8 y Win8.1 / Win10, es posible que necesite detectar el sistema operativo y ramificar su estrategia de registro de diccionario.

En general, los usos típicos de los diccionarios personalizados deberían seguir funcionando como siempre, con poca diferencia entre .NET 4.6.1 y versiones anteriores.

También consulte https://support.microsoft.com/en-us/kb/3088234 para obtener información adicional.


Hemos experimentado un problema similar y hemos visto un rendimiento mejorado al evitar volver a registrar diccionarios personalizados en cada control TextBox durante la carga.

Desafortunadamente, nos topamos con otro problema con la forma en que se manejan los diccionarios personalizados que también puede dar como resultado tiempos de carga muy largos si tiene incluso una pequeña cantidad de controles TextBox.

Cuando una aplicación WPF registra un diccionario personalizado en .NET 4.6.1 en Windows 8.1 / 10, se crea un archivo de diccionario temporal en% localappdata% / Temp y esto se registra en el valor multicanal _GLOBAL_ en la clave de registro "Computadora / HKEY_CURRENT_USER / Software / Microsoft / Spelling / Dictionaries ".

Si el valor _GLOBAL_ termina haciendo referencia a un archivo de diccionario que no existe, la aplicación comienza a mostrar una carga muy lenta cada vez que se inicializa un control con revisión ortográfica habilitada.

Esto puede suceder utilizando el botón "Detener la depuración" en Visual Studio y luego ejecutando el Liberador de espacio en disco o CCleaner después de que haya pasado suficiente tiempo para que estos eliminen los archivos del diccionario temporal.

Logramos solucionar esto borrando el valor _GLOBAL_ de todos los enlaces a archivos de diccionario que no existían. Nuestra aplicación comenzó a funcionar como se esperaba.

Creamos el siguiente error de conexión: https://connect.microsoft.com/VisualStudio/feedback/details/2153484