Apakah ada beberapa konstruksi global yang dapat saya gunakan setiap kali saya perlu mengakses apakah tombol Control, Shift, Alt sedang down? Misalnya di dalam MouseDownacara a TreeView.
Kalau begitu bagaimana?
Apakah ada beberapa konstruksi global yang dapat saya gunakan setiap kali saya perlu mengakses apakah tombol Control, Shift, Alt sedang down? Misalnya di dalam MouseDownacara a TreeView.
Kalau begitu bagaimana?
Jawaban:
Gunakan kelas Keyboard. Menggunakan Keyboard.IsKeyDownAnda dapat memeriksa apakah Control, Shift, Alt turun sekarang.
Untuk Shift:
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
Untuk Kontrol:
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
Untuk Alt:
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
Ada juga:
// 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.Shiftpernyataan. Jika Anda ingin menangkap tombol shift tetapi tidak peduli apakah pengubah lain ditekan pada saat yang sama, gunakan (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shiftsintaks HasFlag atau yang jauh lebih baikKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow.
Keyboard.Modifierstampil sebagaiNone
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;
}
}
Ini adalah bagaimana saya menanganinya (menggunakan PreviewKeyDown), katakanlah kita mencari Alt + R ...
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
&& e.SystemKey == Key.R)
{
//do whatever
}
}
Mungkin seseorang dapat menjelaskan mengapa saya harus menggunakan e.SystemKey dan bukan hanya e.Key, mungkin karena pengubahnya? tapi ini berhasil bagi saya ketika mencari kunci pengubah +.
Sebagian meminjam dari @Josh, dan agak mirip dengan @Krushik, dan juga merujuk pertanyaan tentang Perbedaan antara KeyEventArgs.systemKey dan KeyEventArgs.Key (menjawab mengapa Josh harus menggunakan SystemKey); di mana, dengan kunci pengubah (seperti Alt), e.Key mengembalikan Key.System, dan dengan demikian kunci 'asli' ada dalam e.SystemKey.
Cara untuk mengatasi ini, adalah dengan terlebih dahulu mengambil kunci 'asli', dan kemudian lakukan kondisional Anda:
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)alih - alih semua hal lainnya ...