Có một số cấu trúc toàn cầu mà tôi có thể sử dụng bất cứ khi nào tôi cần truy cập xem các nút Control, Shift, Alt có bị hỏng không? Ví dụ bên trong MouseDown
sự kiện của a TreeView
.
Nếu vậy thì thế nào?
Có một số cấu trúc toàn cầu mà tôi có thể sử dụng bất cứ khi nào tôi cần truy cập xem các nút Control, Shift, Alt có bị hỏng không? Ví dụ bên trong MouseDown
sự kiện của a TreeView
.
Nếu vậy thì thế nào?
Câu trả lời:
Sử dụng lớp học Keyboard
. Sử dụng Keyboard.IsKeyDown
bạn có thể kiểm tra xem Control, Shift, Alt có bị hỏng không.
Đối với ca:
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
Để kiểm soát:
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
Đối với Alt:
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
Ngoài ra còn có:
// Have to get this value before opening a dialog, or user will have released the control key
if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
{
}
Keyboard.Modifiers == ModifierKeys.Shift
câu lệnh. Nếu bạn muốn bắt phím shift nhưng không quan tâm nếu các công cụ sửa đổi khác được nhấn cùng lúc, hãy sử dụng (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
cú pháp HasFlag tốt hơn nhiềuKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow
.
Keyboard.Modifiers
hiển thị nhưNone
private bool IsShiftKey { get; set; }
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
IsShiftKey = Keyboard.Modifiers == ModifierKeys.Shift ? true : false;
if ((Key.Oem3 == e.Key || ((IsShiftKey && Key.Oem4 == e.Key) || (IsShiftKey && Key.Oem6 == e.Key) || (IsShiftKey && Key.Oem5 == e.Key)) && (validatorDefn as FormatValidatorDefinition).format == "packedascii"))
{
e.Handled = true;
}
}
Đây là cách tôi xử lý nó (sử dụng PreviewKeyDown), giả sử chúng ta đang tìm kiếm Alt + R ...
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
&& e.SystemKey == Key.R)
{
//do whatever
}
}
Có lẽ ai đó có thể làm rõ lý do tại sao tôi phải sử dụng e.SystemKey và không chỉ e.Key, có thể do công cụ sửa đổi? nhưng điều này đã làm việc hoàn hảo cho tôi khi tìm kiếm phím bổ trợ +.
Mượn một phần từ @Josh, và hơi giống với @Krushik, và cũng tham khảo một câu hỏi về Sự khác biệt giữa KeyEventArgs.systemKey và KeyEventArgs.Key (trả lời tại sao Josh phải sử dụng SystemKey); trong đó, với các phím bổ trợ (như Alt), e.Key trả về Key.System và do đó, khóa 'thực' nằm trong e.SystemKey.
Một cách để giải quyết vấn đề này là trước tiên hãy tìm khóa 'thực' và sau đó thực hiện điều kiện của bạn:
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
// Fetch the real key.
var key = e.Key == Key.System ? e.SystemKey : e.Key;
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
&& key == Key.Return)
{
// Execute your code.
}
}
(e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control)
thay vì tất cả những thứ khác ...