Ant*_*ien 12 wpf user-input keyboard-shortcuts
在我的应用程序中,我想让用户自定义键盘快捷键,就像在Visual Studio的键盘选项中一样.用户可以聚焦空白文本框,然后键入他想要分配给命令的任何快捷方式.
我最接近它的工作是订阅TextBox.PreviewKeyDown事件,将其设置为处理以防止在文本框中输入实际文本.然后我忽略与修饰键相关联的KeyDown事件(是否有更简洁的方法来确定Key是否是修饰键?).
// Code-behind
private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
// The text box grabs all input
e.Handled = true;
if (e.Key == Key.LeftCtrl ||
e.Key == Key.RightCtrl ||
e.Key == Key.LeftAlt ||
e.Key == Key.RightAlt ||
e.Key == Key.LeftShift ||
e.Key == Key.RightShift)
return;
string shortcutText = "";
if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
shortcutText += "Ctrl+";
if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
shortcutText += "Shift+";
if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)
shortcutText += "Alt+";
_ShortcutTextBox.Text = shortcutText + e.Key.ToString();
}
Run Code Online (Sandbox Code Playgroud)
以上适用于以Ctrl和Ctrl + Shift开头的任何快捷方式,但对于任何Alt快捷方式都失败.Key.System当我按下包含Alt的快捷键时,e.Key始终设置为.
如何记录用户的Alt快捷键?是否有更好,更健壮的方式来记录用户的快捷方式?
Fré*_*idi 26
如果Key属性设置为:诀窍是使用SystemKey属性:Key.System
private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
// The text box grabs all input.
e.Handled = true;
// Fetch the actual shortcut key.
Key key = (e.Key == Key.System ? e.SystemKey : e.Key);
// Ignore modifier keys.
if (key == Key.LeftShift || key == Key.RightShift
|| key == Key.LeftCtrl || key == Key.RightCtrl
|| key == Key.LeftAlt || key == Key.RightAlt
|| key == Key.LWin || key == Key.RWin) {
return;
}
// Build the shortcut key name.
StringBuilder shortcutText = new StringBuilder();
if ((Keyboard.Modifiers & ModifierKeys.Control) != 0) {
shortcutText.Append("Ctrl+");
}
if ((Keyboard.Modifiers & ModifierKeys.Shift) != 0) {
shortcutText.Append("Shift+");
}
if ((Keyboard.Modifiers & ModifierKeys.Alt) != 0) {
shortcutText.Append("Alt+");
}
shortcutText.Append(key.ToString());
// Update the text box.
_ShortcutTextBox.Text = shortcutText.ToString();
}
Run Code Online (Sandbox Code Playgroud)
我将左右Windows键添加到修改器列表中,因为当Ctrl+Shift+Alt从终端服务器会话中键入complex()组合键时,它们有时会出现在快捷键名称中.Keyboard.Modifiers但是,它们永远不会存在,因为它们是为全局捷径保留的,所以我不会在那里处理它们.
我还使用StringBuilder来避免创建太多string实例.
此解决方案适用于任何组合键,但Shift+Alt(Alt在这种情况下不会看到修饰符).这可能是我的终端服务器环境的工件,所以你的里程可能会有所不同.
最后,我_File在窗口中添加了一个菜单,看看会发生什么,并且Alt+F快捷键在到达菜单之前被文本框有效地捕获,这似乎是你想要的.
| 归档时间: |
|
| 查看次数: |
4374 次 |
| 最近记录: |