Apakah ada beberapa konstruksi global yang dapat saya gunakan setiap kali saya perlu mengakses apakah tombol Control, Shift, Alt sedang down? Misalnya di dalam MouseDown
acara 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 MouseDown
acara a TreeView
.
Kalau begitu bagaimana?
Jawaban:
Gunakan kelas Keyboard
. Menggunakan Keyboard.IsKeyDown
Anda 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.Shift
pernyataan. Jika Anda ingin menangkap tombol shift tetapi tidak peduli apakah pengubah lain ditekan pada saat yang sama, gunakan (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
sintaks HasFlag atau yang jauh lebih baikKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow
.
Keyboard.Modifiers
tampil 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 ...