2011-11-01 26 views
16

Tôi đang xử lý sự kiện PreviewTextInput trên cửa sổ của mình để xử lý các thao tác vuốt từ trình đọc thẻ từ. Tôi xử lý các sự kiện trên cửa sổ, để nó không quan trọng mà điều khiển cá nhân là tập trung.Tại sao PreviewTextInput không xử lý dấu cách?

Khi trình xử lý xác định thao tác vuốt đã bắt đầu (ký tự '%' hoặc ';'), nó xử lý mọi sự kiện cho đến khi thao tác vuốt hoàn tất. Hệ thống này thường hoạt động khá độc đáo, với một vài ngoại lệ quan trọng:

Khi ký tự khoảng trắng (và có thể là ký tự \ n) được nhập từ đầu đọc, chúng không được xử lý bởi PreviewTextInput, nhưng được gửi trực tiếp vào bất kỳ điều khiển nào tập trung. Thật kỳ lạ, người xử lý không nhận được ký tự. Điều này gây ra hành vi không mong muốn.

Điều tôi muốn là cách chụp tất cả sự kiện chính ở cấp cửa sổ và có cơ hội xử lý chúng nếu tôi muốn. Tôi đã thử PreviewKeyDown và tìm thấy nó một chút cồng kềnh để sử dụng, và để có được giá trị char từ. PreviewTextInput đẹp hơn nhiều vì tôi chỉ có thể đọc thuộc tính Text.

Có lý do gì mà PreviewTextInput không xử lý các ký tự nhất định? Có phương pháp so sánh nào để có được tất cả các sự kiện, kể cả không gian?

Trả lời

10

tôi tìm thấy một số loại giải thích trong this WPF forum question:

Bởi vì một số IME sẽ đối xử với tổ hợp phím khoảng trắng như một phần của quá trình sáng tác văn bản, đó là lý do tại sao nó ăn lên bởi Avalon báo cáo văn bản ghép đúng qua sự kiện TextInput.

Và một số thông tin hơn từ MSDN documentation of the TextInput event:

... Đối với đầu vào bàn phím, WPF đầu tiên gửi các sự kiện KeyDown/KeyUp thích hợp. Nếu những sự kiện đó không được xử lý và khóa là văn bản (thay vì phím điều khiển như mũi tên hướng hoặc phím chức năng), thì sự kiện TextInput được nâng lên. Không phải lúc nào cũng có một ánh xạ một đối một đơn giản giữa các sự kiện KeyDown/KeyUp và TextInput vì nhiều lần nhấn phím có thể tạo ra một ký tự đầu vào văn bản và các lần nhấn phím đơn có thể tạo ra các chuỗi nhiều ký tự. Điều này đặc biệt đúng đối với các ngôn ngữ như tiếng Trung, tiếng Nhật và tiếng Hàn, sử dụng Trình chỉnh sửa phương thức nhập (IME) để tạo ra hàng nghìn ký tự có thể có trong bảng chữ cái tương ứng của chúng.

Khi WPF gửi sự kiện KeyUp/KeyDown, Khóa được đặt thành Khóa.System nếu tổ hợp phím có thể trở thành một phần của sự kiện TextInput (ví dụ: nếu ALT + S được nhấn). Điều này cho phép mã trong một trình xử lý sự kiện KeyDown để kiểm tra Key.System và, nếu được tìm thấy, hãy để xử lý cho trình xử lý của sự kiện TextInput được nâng lên sau đó. Trong những trường hợp này, các thuộc tính khác nhau của đối số TextCompositionEventArgs có thể được sử dụng để xác định các tổ hợp phím gốc. Tương tự, nếu IME đang hoạt động, Khóa có giá trị của Key.ImeProcessed và ImeProcessedKey sẽ cho phép gõ phím hoặc gõ phím gốc.

BTW, Dưới đây là hai câu hỏi liên quan:

3

Một cách giải quyết khác mà tôi đã tìm thấy là móc PreviewKeyDown thay vì PreviewTextInput. Thật không may, cách tiếp cận đó đòi hỏi nhiều runaround hơn để có được một char cụ thể cho những gì họ nhấn nút. Cách đáng tin cậy nhất tôi tìm thấy là trong this question. Nó cảm thấy khá cồng kềnh cho những gì tôi cảm thấy nên được khá đơn giản. Bất cứ ai có một cách tốt hơn để làm điều này?

+0

yea, đó là điều tương tự tôi đã kết thúc bằng – 00jt

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