2015-02-06 110 views
5

Czy ktoś wie, w jaki sposób można łatwo wykryć, czy edytor IME systemu Windows jest aktywny w framworkach Silverlight. Pozwól mi wyjaśnić scenariusz, który powoduje mi problemy:Wykrywanie, czy edytor IME (Input Method Editor) jest aktywny w Silverlight

Mam hit problem, w którym przy użyciu chińskiego (uproszczony, Chiny) Microsoft Pinyin powoduje wyjątek CLR. Scenariusz dotyczy sytuacji, w której TextBox obsługuje zdarzenie TextChanged. Na przykład:

  • TextBox nie powinien akceptować znaków, ale tylko cyfry. Aby to osiągnąć, obsługuje on zdarzenie TextChanged iw tym przypadku obsługuje dane wejściowe, odwracając właściwość Text do ostatniej poprawnej litery wejściowej po znaku. W tym scenariuszu, jeśli zostanie użyty IME (chiński (uproszczony, chiński) Microsoft Pinyin), zostanie zgłoszony kod FatalExecutionEngineError.

W WPF można przezwyciężyć ten problem, nie odwracając tekstu w zdarzeniu TextChanged za pomocą InputMethod.Current. ImeState, aby sprawdzić, czy edytor IME jest aktywny. Niestety nie jest to dostępne w środowisku Silverlight, dlatego publikuję to pytanie.

Obecnie jedyne, co znalazłem, to to, że mogłem ustawić właściwość IsInputMethodEnabled klasy InputMethod na kontrolkę TextBox w celu wyłączenia wszystkich wejść IME, ale to oczywiście nie tylko wyłącza nieprawidłowe wejście, ale także prawidłowe.

Ktoś ma pomysły, jak mogę wykryć, czy edytor IME jest używany/aktywny na platformie Silverlight? Dzięki.

Odpowiedz

7

Udało mi się rozwiązać problem w obu frameworkach WPF i Silverlight. Problem spowodowany był faktem, że obsługa tekstu TextBox podczas wprowadzania przez IME symboli, które powodował, że tekst powodował, że sam edytor IME zmienił dane wejściowe, ale wygląda na to, że nie jest obsługiwany z wdzięcznością przez system operacyjny Windows i powodował wyjątek CLR.

Co zrobiłem było:

W ramach WPF jak wspomniano użyłem statyczną wartość InputMethod.Current.ImeState celu ustalenia, czy IME jest aktywny i czy to z wartości na pominąłem powracanie właściwość TextBox tekstów w zdarzenie TextChanged.

W środowisku Silverlight używam kombinacji zdarzeń TextInputStart, TextInputUpdate i lokalnego pola prywatnego do zapisania, jeśli wykryto IME. Zdarzenie TextInputUpdate jest wyzwalane tylko wtedy, gdy edytor IME jest aktywny i używany jako dane wejściowe, a wywołanie TextInputStart jest zawsze wyzwalane. To, co zrobiłem:

  1. Utworzono bool IsImeActive = false; złożony
  2. Hak do zdarzenia TextInputStart pola tekstowego
  3. W takim przypadku w polu IsImeActive do fałszywych
  4. Hook do zdarzenia TextInputUpdate pola tekstowego
  5. W takim przypadku w polu IsImeActive True
  6. Na koniec w zdarzeniu TextChanged dodaj warunek, który sprawdza pole IsImeActive, a jeśli jest False, uruchom logikę, która obsługuje (odwraca) dane wejściowe.

Mam nadzieję, że to jest pomocne.