Control, Shift, Alt düğmelerinin basılı olup olmadığına erişmem gerektiğinde kullanabileceğim bazı global yapılar var mı? Örneğin MouseDown
a TreeView
.
Öyleyse nasıl?
Control, Shift, Alt düğmelerinin basılı olup olmadığına erişmem gerektiğinde kullanabileceğim bazı global yapılar var mı? Örneğin MouseDown
a TreeView
.
Öyleyse nasıl?
Yanıtlar:
Sınıfı kullanın Keyboard
. Keyboard.IsKeyDown
Tuşunu kullanarak Control, Shift, Alt tuşlarının basılı olup olmadığını kontrol edebilirsiniz.
Shift için:
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
Kontrol için:
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
Alt için:
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
Ayrıca:
// 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
ifadeyi kullanın . Shift tuşunu yakalamak istiyorsanız, ancak aynı anda diğer değiştiricilere basıldığında umursamıyorsanız, (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
veya daha iyi HasFlag sözdizimini kullanınKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow
.
Keyboard.Modifiers
olarak gösterirNone
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;
}
}
Bu şekilde idare ediyorum (PreviewKeyDown kullanarak), diyelim ki Alt + R ...
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
&& e.SystemKey == Key.R)
{
//do whatever
}
}
Belki birileri neden sadece e.Key değil e.SystemKey kullanmak zorunda olduğumu temizleyebilir, belki de değiştiriciden dolayı? ancak değiştirici + anahtar ararken bu benim için kusursuz bir şekilde çalıştı.
Kısmen @Josh'tan borçlanma ve bir şekilde @ Kruşik'e benzer ve ayrıca KeyEventArgs.systemKey ve KeyEventArgs.Key arasındaki fark hakkında bir soruya atıfta bulunma (Josh'un SystemKey'i neden kullanması gerektiğini cevaplama); buradaki değiştirici tuşlarla (Alt gibi), e.Key Key.System öğesini döndürür ve bu nedenle 'gerçek' anahtar e.SystemKey içinde olur.
Bunun bir yolu, önce 'gerçek' anahtarı getirmektir ve sonra koşullu yapmaktır:
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)
tüm diğer şeyleri yerine kontrol edebilirsiniz ...