2015-02-06 11 views
5

Có ai biết cách tôi có thể dễ dàng phát hiện xem IME của Windows OS (Trình soạn thảo phương thức nhập) có hoạt động trong khung công tác Silverlight hay không. Hãy để tôi giải thích kịch bản gây ra sự cố cho tôi:Phát hiện xem IME (Trình soạn thảo phương thức nhập liệu) có đang hoạt động trong Silverlight

Tôi đã gặp vấn đề khi sử dụng tiếng Việt bính âm (Trung Quốc, Giản thể) của Microsoft gây ra ngoại lệ CLR. Kịch bản là khi một TextBox đang xử lý sự kiện TextChanged của nó. Ví dụ:

  • Hộp văn bản không được chấp nhận ký tự nhưng chỉ có số. Để đạt được điều đó, nó đang xử lý sự kiện TextChanged của nó và trong trường hợp đó nó xử lý đầu vào bằng cách đảo ngược thuộc tính Text của nó thành ký tự đầu vào chính xác cuối cùng theo ký tự. Trong trường hợp này, nếu IME (tiếng Trung Quốc (Giản thể, Trung Quốc) IME của Việt Nam được sử dụng, một số FatalExecutionEngineError sẽ bị ném.

Trong WPF, có thể khắc phục sự cố này bằng cách không đảo ngược Văn bản trong sự kiện TextChanged bằng cách sử dụng InputMethod.Current. ImeState để kiểm tra xem IME có đang hoạt động hay không. Thật không may, điều này không có sẵn trong khung công tác Silverlight, đó là lý do tại sao tôi đăng câu hỏi này.

Hiện tại điều duy nhất tôi tìm thấy là tôi có thể đặt thuộc tính IsInputMethodEnabled của lớp InputMethod vào điều khiển TextBox để vô hiệu hóa tất cả đầu vào IME nhưng điều này tất nhiên sẽ không chỉ vô hiệu hóa đầu vào không chính xác mà còn đúng.

Bất cứ ai cũng có bất kỳ ý tưởng nào về cách tôi có thể phát hiện nếu IME được sử dụng/hoạt động trong nền tảng Silverlight? Cảm ơn.

Trả lời

7

Tôi đã có thể giải quyết vấn đề trong cả khung công tác WPF và Silverlight. Vấn đề là do việc xử lý TextBox Text trong khi IME nhập các ký hiệu mà Text đang tự tạo IME thay đổi đầu vào của nó, có vẻ như nó không được hệ điều hành Windows xử lý một cách duyên dáng và gây ra một ngoại lệ CLR.

Những gì tôi đã làm là:

Trong khuôn khổ WPF như đã đề cập tôi đã sử dụng các giá trị InputMethod.Current.ImeState tĩnh để xác định xem IME đang hoạt động và nếu nó là có giá trị On tôi bỏ qua quay trở lại TextBox Văn bản tài sản trong sự kiện TextChanged của nó.

Trong khung công tác Silverlight, tôi sử dụng kết hợp các sự kiện TextInputStart, TextInputUpdate và trường riêng tư cục bộ để lưu trữ nếu IME được phát hiện. Sự kiện TextInputUpdate chỉ được kích hoạt nếu IME đang hoạt động và được sử dụng làm đầu vào và TextInputStart luôn được kích hoạt. Những gì tôi đã làm là:

  1. Tạo một bool IsImeActive = false; nộp
  2. Hook sự kiện TextInputStart của TextBox
  3. Trong trường hợp đó thiết lập các lĩnh vực IsImeActive False
  4. Hook sự kiện TextInputUpdate của TextBox
  5. Trong trường hợp đó thiết lập các lĩnh vực IsImeActive True
  6. Cuối cùng trong sự kiện TextChanged thêm một điều kiện để kiểm tra trường IsImeActive và nếu nó chạy sai thì logic xử lý (đảo ngược) đầu vào.

Hy vọng điều này hữu ích.

Các vấn đề liên quan