2010-01-25 41 views
11

Trong ứng dụng của tôi, tôi muốn cho phép người dùng tùy chỉnh phím tắt, giống như được thực hiện trong các tùy chọn bàn phím của Visual Studio. Người dùng có thể tập trung vào một hộp văn bản trống và sau đó gõ bất kỳ phím tắt nào anh ta muốn gán cho một lệnh.Làm cách nào để đọc lối tắt bàn phím tùy chỉnh từ người dùng trong WPF?

Gần nhất tôi đã đến để làm cho nó hoạt động là bằng cách đăng ký vào sự kiện TextBox.PreviewKeyDown, thiết lập nó như được xử lý để ngăn chặn đầu vào văn bản thực tế trong hộp văn bản. Sau đó tôi bỏ qua các sự kiện KeyDown liên kết với các phím bổ trợ (có cách nào rõ ràng hơn để xác định xem một khóa có phải là một phím bổ trợ không?).

// Code-behind 
private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    // The text box grabs all input 
    e.Handled = true; 

    if (e.Key == Key.LeftCtrl || 
     e.Key == Key.RightCtrl || 
     e.Key == Key.LeftAlt || 
     e.Key == Key.RightAlt || 
     e.Key == Key.LeftShift || 
     e.Key == Key.RightShift) 
     return; 

    string shortcutText = ""; 
    if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) 
     shortcutText += "Ctrl+"; 
    if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift) 
     shortcutText += "Shift+"; 
    if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) 
     shortcutText += "Alt+"; 
    _ShortcutTextBox.Text = shortcutText + e.Key.ToString(); 

} 

Tác vụ trên cho mọi phím tắt bắt đầu bằng Ctrl và Ctrl + Shift, nhưng không thành công cho bất kỳ phím tắt Alt nào. E.Key luôn được đặt thành Key.System khi tôi nhấn phím tắt có chứa Alt.

Tôi làm cách nào để ghi lại phím tắt Alt từ người dùng? Có cách nào tốt hơn, mạnh mẽ hơn để ghi lại lối tắt tạo thành người dùng không?

+0

Tôi có cảm giác phím Alt được WPF sử dụng để cố gắng chụp tổ hợp phím Alt để tập trung vào điều khiển được gắn với nhãn có phím tắt chú thích (như Alt + F cho menu _File hoặc Alt + O cho nút _OK). Có thể có cách để ngăn chặn hoặc ghi đè điều đó? –

Trả lời

23

Bí quyết là sử dụng SystemKey tài sản nếu tài sản Key được thiết lập để Key.System:

private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    // The text box grabs all input. 
    e.Handled = true; 

    // Fetch the actual shortcut key. 
    Key key = (e.Key == Key.System ? e.SystemKey : e.Key); 

    // Ignore modifier keys. 
    if (key == Key.LeftShift || key == Key.RightShift 
     || key == Key.LeftCtrl || key == Key.RightCtrl 
     || key == Key.LeftAlt || key == Key.RightAlt 
     || key == Key.LWin || key == Key.RWin) { 
     return; 
    } 

    // Build the shortcut key name. 
    StringBuilder shortcutText = new StringBuilder(); 
    if ((Keyboard.Modifiers & ModifierKeys.Control) != 0) { 
     shortcutText.Append("Ctrl+"); 
    } 
    if ((Keyboard.Modifiers & ModifierKeys.Shift) != 0) { 
     shortcutText.Append("Shift+"); 
    } 
    if ((Keyboard.Modifiers & ModifierKeys.Alt) != 0) { 
     shortcutText.Append("Alt+"); 
    } 
    shortcutText.Append(key.ToString()); 

    // Update the text box. 
    _ShortcutTextBox.Text = shortcutText.ToString(); 
} 

tôi đã thêm bên trái và bên phải Windows phím vào danh sách công cụ sửa đổi, vì chúng đôi khi xuất hiện trong tên phím tắt khi phức tạp (Ctrl+Shift+Alt) tổ hợp phím được gõ từ một phiên Terminal Server. Tuy nhiên, chúng không bao giờ có mặt ở Keyboard.Modifiers vì chúng được dành riêng cho các phím tắt chung nên tôi không xử lý chúng ở đó.

Tôi cũng đã sử dụng StringBuilder để tránh tạo quá nhiều string phiên bản.

Giải pháp này hoạt động với bất kỳ tổ hợp phím nào, ngoại trừ Shift+Alt (sửa đổi Alt không được nhìn thấy trong trường hợp đó). Đó có thể là một tạo phẩm của môi trường Terminal Server của tôi, vì vậy, số dặm của bạn có thể thay đổi.

Cuối cùng, tôi đã thêm một menu _File vào cửa sổ để xem điều gì sẽ xảy ra và phím tắt Alt+F bị chặn một cách hiệu quả bởi hộp văn bản trước khi đến trình đơn, có vẻ như bạn muốn.

+0

+1, giải pháp tốt hơn tôi. Không biết về Key key = (e.Key == Key.System? E.SystemKey: e.Key); lừa :) –

+0

Hoạt động! Cảm ơn bạn rất nhiều! –

+0

tốt nhất, cảm ơn bạn đã chia sẻ! – Califf

-1

Hi
nếu You used WPF-Command trong ứng dụng của bạn, bạn có thể sử dụng này:

<Window.InputBindings> 
    <KeyBinding Command="YourCommnad" 
       Gesture="CTRL+C" /> 
</Window.InputBindings> 
+1

Điều này không trả lời được câu hỏi. Câu hỏi là làm thế nào để đọc một sự kết hợp của các phím trong một hộp văn bản, không phải làm thế nào để xác định các phím nóng trong XAML. – alexandrudicu

+1

Mặc dù điều này không trả lời được câu hỏi của áp phích gốc, đây thực tế là câu trả lời tôi đang tìm kiếm khi tôi tình cờ gặp luồng này thông qua googling. Vì vậy, chỉ muốn cho người khác biết, trong năm 2016, đây là một giải pháp tuyệt vời để khóa toàn bộ cửa sổ. – Kikootwo

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