2015-02-06 13 views
5

Qualcuno sa come è possibile rilevare facilmente se IME di Windows OS (Input Method Editor) è attivo nel framwork di Silverlight. Lasciatemi spiegare lo scenario che mi sta causando problemi:Rilevare se IME (Input Method Editor) è attivo in Silverlight

Ho riscontrato un problema in cui l'utilizzo di un Pinyin Microsoft (semplificato, cinese) Microsoft causa un'eccezione CLR. Lo scenario è quando un TextBox sta gestendo il suo evento TextChanged. Ad esempio:

  • Un TextBox non deve accettare caratteri ma solo numeri. Per riuscirci sta gestendo il suo evento TextChanged e in quel caso gestisce l'input invertendo la sua proprietà Text all'ultimo carattere di input corretto per carattere. In questo scenario se viene utilizzato un IME (cinese (semplificato, Cina) Microsoft Pinyin) viene emesso un valore FatalExecutionEngineError.

In WPF è possibile risolvere questo problema non invertendo il testo nell'evento TextChanged utilizzando InputMethod.Current. ImeState per verificare se un IME è attivo. Purtroppo questo non è disponibile nel framework Silverlight ed è per questo che sto postando questa domanda.

Attualmente l'unica cosa che ho trovato è che ho potuto impostare la proprietà IsInputMethodEnabled della classe InputMethod al controllo TextBox per disabilitare tutti gli input IME, ma questo naturalmente non solo disabilitare l'ingresso errato, ma anche quella corretta.

Qualcuno ha qualche idea su come rilevare se un IME è utilizzato/attivo nella piattaforma Silverlight? Grazie.

risposta

7

Sono stato in grado di risolvere il problema in entrambi i framework WPF e Silverlight. Il problema è stato causato dal fatto che gestendo il TextBox Text mentre un IME sta inserendo simboli che Text stava facendo l'IME stesso modifica il suo input che sembra non sia gestito con garbo dal sistema operativo Windows e stava causando un'eccezione CLR.

Quello che ho fatto è stato:

Nel quadro WPF come detto ho usato il valore InputMethod.Current.ImeState statica per determinare se IME è attivo e se è stato con valore On Ho saltato un ritorno alla proprietà Text in TextBox il suo evento TextChanged.

Nel framework Silverlight utilizzo una combinazione di TextInputStart, eventi TextInputUpdate e un campo privato locale da memorizzare se è stato rilevato IME. L'evento TextInputUpdate viene attivato solo se IME è attivo e utilizzato come input e TextInputStart viene sempre attivato. Quello che ho fatto è stato:

  1. Creato un bool IsImeActive = false; archiviato
  2. Hook all'evento TextInputStart del controllo TextBox
  3. In tal caso impostare il campo IsImeActive False
  4. Hook all'evento TextInputUpdate del controllo TextBox
  5. In tal caso impostare il campo IsImeActive True
  6. Infine nell'evento TextChanged aggiungi una condizione che controlli il campo IsImeActive e, se è False, esegui la logica che gestisce (inverte) l'input.

Spero che questo sia utile.

Problemi correlati