每当需要访问Control,Shift,Alt按钮是否关闭时,是否可以使用一些全局构造?例如的内部MouseDown
事件TreeView
。
如果可以,怎么办?
每当需要访问Control,Shift,Alt按钮是否关闭时,是否可以使用一些全局构造?例如的内部MouseDown
事件TreeView
。
如果可以,怎么办?
Answers:
使用类Keyboard
。使用Keyboard.IsKeyDown
可以检查Control,Shift,Alt现在是否关闭。
对于班次:
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
对于控制:
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
对于Alt:
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
还有:
// 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
语句。如果您想抓住Shift键却不在乎是否同时按下了其他修饰符,请使用(Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
或更好的HasFlag语法Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow
。
Keyboard.Modifiers
显示为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;
}
}
这就是我的处理方式(使用PreviewKeyDown),假设我们正在寻找Alt + R ...
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
&& e.SystemKey == Key.R)
{
//do whatever
}
}
也许有人可以弄清楚为什么我不得不使用e.SystemKey而不是仅仅使用e.Key,也许是由于修改器的缘故?但这在搜索修饰符+键时对我来说是完美的。
部分是从@Josh借用的,与@Krushik有点类似,并且还引用了有关KeyEventArgs.systemKey和KeyEventArgs.Key之间的区别的问题(回答为何Josh必须使用SystemKey);其中,使用修饰键(例如Alt),e.Key返回Key.System,因此“真实”键在e.SystemKey中。
一种解决方法是,首先获取“真实”密钥,然后执行条件操作:
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)
而不是检查其他所有内容即可