2015-02-06 43 views
5

有誰知道我如何輕鬆檢測Windows OS IME(輸入法編輯器)是否在Silverlight框架中處於活動狀態。讓我來解釋導致我遇到的情況:檢測IME(輸入法編輯器)是否在Silverlight中處於活動狀態

我遇到了使用中文(簡體中文)Microsoft拼音導致CLR異常的問題。該場景是當TextBox正在處理其TextChanged事件時。例如:

  • 一個TextBox不應該接受字符,而只能接受數字。爲了實現它正在處理它的TextChanged事件,並且在那種情況下,它通過將其Text屬性反轉爲最後一個正確的輸入字符來處理輸入。在這種情況下,如果使用(中文(簡體,中國)Microsoft拼音)IME,則會引發FatalExecutionEngineError

在WPF中,可以通過使用InputMethod.Current不顛倒TextChanged事件中的Text來克服此問題。 ImeState來檢查IME是否處於活動狀態。不幸的是,這在Silverlight框架中是不可用的,這就是我發佈這個問題的原因。

目前我唯一發現的是,我可以將InputMethod類的IsInputMethodEnabled屬性設置爲TextBox控件,以禁用所有IME輸入,但這當然不僅會禁用不正確的輸入,而且會禁用正確的輸入。

任何人有任何想法如何檢測IME是否在Silverlight平臺中使用/活動?謝謝。

回答

7

我能夠解決WPF和Silverlight框架中的問題。這個問題是由於在IME輸入符號時處理TextBox Text造成IME本身改變其輸入,而這看起來像是Windows操作系統不能正常處理並導致CLR異常。

我所做的是:

在WPF框架提到我使用的靜態InputMethod.Current.ImeState值,以確定是否IME是活動的,如果它是與價值我跳過恢復在TextBox Text屬性它的TextChanged事件。

在Silverlight框架中,我使用TextInputStart,TextInputUpdate事件和本地專用字段的組合來存儲IME是否被檢測到。只有在IME處於活動狀態並用作輸入並且始終觸發TextInputStart時,纔會觸發TextInputUpdate事件。我做的是:

  1. 創建一個bool IsImeActive = false;提起
  2. 鉤到TextBox的TextInputStart事件
  3. 在這種情況下設置IsImeActive場爲False
  4. 鉤到TextBox
  5. 在這種情況下的TextInputUpdate事件設置IsImeActive字段設置爲真
  6. 最後在TextChanged事件中添加一個檢查IsImeActive字段的條件,如果它是False,則運行處理(反轉)輸入的邏輯。

希望這會對您有所幫助。

相關問題