一、概述
InputBindings 是 WPF 中UIElement 的内置集合属性,用于将键盘、鼠标输入手势 直接绑定到 ICommand,是 MVVM 模式下实现快捷键、全局热键、鼠标操作的标准、解耦方式。
- 支持:KeyBinding(键盘)、MouseBinding(鼠标)
- 作用域:Window / UserControl / 任意控件(仅焦点内生效)
- 自动支持命令的 CanExecute,无需写事件判断
二、核心类结构
- InputBinding :抽象基类
- KeyBinding:键盘绑定
- MouseBinding:鼠标绑定
- InputGesture
- KeyGesture:按键 + 修饰键
- MouseGesture:鼠标动作 + 修饰键
三、KeyBinding 键盘绑定
1. 常用属性
- Gesture :快捷写法,如
Ctrl+S
- Key:主键(A-Z、Enter、F1-F12、Esc 等)
- Modifiers:修饰键(Control、Alt、Shift、Windows、None)
- Command:绑定命令
- CommandParameter:命令参数
2. XAML 标准写法
XML
复制代码
<Window.InputBindings>
<KeyBinding Gesture="Ctrl+S" Command="{Binding SaveCommand}"/>
<KeyBinding Gesture="Ctrl+Shift+S" Command="{Binding SaveAsCommand}"/>
<KeyBinding Key="F5" Command="{Binding RefreshCommand}"/>
<KeyBinding Key="Esc" Command="{Binding CloseCommand}"/>
<KeyBinding Gesture="Ctrl+Z" Command="ApplicationCommands.Undo"/>
</Window.InputBindings>
3. C# 代码创建
cs
复制代码
var kg = new KeyGesture(Key.S, ModifierKeys.Control);
var kb = new KeyBinding(MyCommand, kg);
this.InputBindings.Add(kb);
四、MouseBinding 鼠标绑定
1. 常用属性
- MouseAction:鼠标动作
- Modifiers:Control / Alt / Shift
- Command
2. XAML 示例
XML
复制代码
<Grid.InputBindings>
<MouseBinding MouseAction="LeftClick" Command="{Binding ClickCommand}"/>
<MouseBinding MouseAction="RightClick" Command="{Binding MenuCommand}"/>
<MouseBinding MouseAction="MiddleClick" Command="{Binding ResetCommand}"/>
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding OpenCommand}"/>
<MouseBinding MouseAction="WheelRotate" Command="{Binding ZoomCommand}"/>
<MouseBinding Modifiers="Control"
MouseAction="LeftClick"
Command="{Binding MultiSelectCommand}"/>
</Grid.InputBindings>
五、常用快捷键速查表(可直接复制使用)
1. 通用编辑类
| 快捷键 |
XAML 写法 |
说明 |
| Ctrl+A |
<KeyBinding Gesture="Ctrl+A" Command="ApplicationCommands.SelectAll"/> |
全选 |
| Ctrl+C |
<KeyBinding Gesture="Ctrl+C" Command="ApplicationCommands.Copy"/> |
复制 |
| Ctrl+X |
<KeyBinding Gesture="Ctrl+X" Command="ApplicationCommands.Cut"/> |
剪切 |
| Ctrl+V |
<KeyBinding Gesture="Ctrl+V" Command="ApplicationCommands.Paste"/> |
粘贴 |
| Ctrl+Z |
<KeyBinding Gesture="Ctrl+Z" Command="ApplicationCommands.Undo"/> |
撤销 |
| Ctrl+Y |
<KeyBinding Gesture="Ctrl+Y" Command="ApplicationCommands.Redo"/> |
重做 |
| Ctrl+F |
<KeyBinding Gesture="Ctrl+F" Command="{Binding FindCommand}"/> |
查找 |
| Ctrl+H |
<KeyBinding Gesture="Ctrl+H" Command="{Binding ReplaceCommand}"/> |
替换 |
2. 文件操作类
| 快捷键 |
XAML 写法 |
| Ctrl+N |
<KeyBinding Gesture="Ctrl+N" Command="{Binding NewCommand}"/> |
| Ctrl+O |
<KeyBinding Gesture="Ctrl+O" Command="{Binding OpenCommand}"/> |
| Ctrl+S |
<KeyBinding Gesture="Ctrl+S" Command="{Binding SaveCommand}"/> |
| Ctrl+Shift+S |
<KeyBinding Gesture="Ctrl+Shift+S" Command="{Binding SaveAsCommand}"/> |
| Ctrl+W |
<KeyBinding Gesture="Ctrl+W" Command="{Binding CloseTabCommand}"/> |
| Ctrl+Q |
<KeyBinding Gesture="Ctrl+Q" Command="{Binding ExitCommand}"/> |
3. 功能键 F1~F12
| 按键 |
XAML |
| F1 |
<KeyBinding Key="F1" Command="{Binding HelpCommand}"/> |
| F2 |
<KeyBinding Key="F2" Command="{Binding RenameCommand}"/> |
| F3 |
<KeyBinding Key="F3" Command="{Binding FindNextCommand}"/> |
| F5 |
<KeyBinding Key="F5" Command="{Binding RefreshCommand}"/> |
| F11 |
<KeyBinding Key="F11" Command="{Binding FullscreenCommand}"/> |
| F12 |
<KeyBinding Key="F12" Command="{Binding SaveCommand}"/> |
4. 导航与控制
| 按键 |
XAML |
| Enter |
<KeyBinding Key="Enter" Command="{Binding ConfirmCommand}"/> |
| Esc |
<KeyBinding Key="Esc" Command="{Binding CancelCommand}"/> |
| Delete |
<KeyBinding Key="Delete" Command="{Binding DeleteCommand}"/> |
| Backspace |
<KeyBinding Key="Back" Command="{Binding BackCommand}"/> |
| Tab |
<KeyBinding Key="Tab" Command="{Binding NextControlCommand}"/> |
| Space |
<KeyBinding Key="Space" Command="{Binding ToggleCommand}"/> |
5. 修饰键组合示例
XML
复制代码
<KeyBinding Gesture="Alt+Left" Command="{Binding GoBackCommand}"/>
<KeyBinding Gesture="Alt+Right" Command="{Binding GoForwardCommand}"/>
<KeyBinding Gesture="Ctrl+Plus" Command="{Binding ZoomInCommand}"/>
<KeyBinding Gesture="Ctrl+Minus" Command="{Binding ZoomOutCommand}"/>
<KeyBinding Gesture="Ctrl+0" Command="{Binding ZoomResetCommand}"/>
六、鼠标手势速查表
1. MouseAction 可选值
| MouseAction |
说明 |
| LeftClick |
左键单击 |
| RightClick |
右键单击 |
| MiddleClick |
中键单击 |
| LeftDoubleClick |
左键双击 |
| RightDoubleClick |
右键双击 |
| WheelRotate |
滚轮滚动 |
2. 常用鼠标绑定模板
XML
复制代码
<!-- 左键单击 -->
<MouseBinding MouseAction="LeftClick" Command="{Binding}"/>
<!-- 左键双击 -->
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding}"/>
<!-- 右键 -->
<MouseBinding MouseAction="RightClick" Command="{Binding}"/>
<!-- Ctrl + 左键多选 -->
<MouseBinding Modifiers="Control"
MouseAction="LeftClick"
Command="{Binding}"/>
<!-- Shift + 左键范围选择 -->
<MouseBinding Modifiers="Shift"
MouseAction="LeftClick"
Command="{Binding}"/>
<!-- 滚轮缩放 -->
<MouseBinding MouseAction="WheelRotate" Command="{Binding}"/>
七、作用域与焦点规则
- Window.InputBindings :全局生效,无需焦点
- 控件.InputBindings :仅控件获得键盘焦点时生效
- TextBox / PasswordBox 等会内部吞噬 Enter、Tab 等按键,可能导致绑定不生效
- 解决方案:使用
PreviewKeyDown 手动触发命令
- MVVM 友好,无代码后置,纯声明式
- 自动响应
CanExecute,自动禁用 / 启用
- 支持全局 / 局部热键
- 支持键盘 + 鼠标 + 修饰键任意组合
- 可复用、可维护、可测试
九、完整可直接运行示例(MVVM)
XML
复制代码
<Window.InputBindings>
<KeyBinding Gesture="Ctrl+S" Command="{Binding SaveCommand}"/>
<KeyBinding Key="F5" Command="{Binding RefreshCommand}"/>
<KeyBinding Key="Esc" Command="{Binding CloseCommand}"/>
</Window.InputBindings>
<Grid>
<Button Content="测试" Command="{Binding TestCommand}">
<Button.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding TestCommand}"/>
</Button.InputBindings>
</Button>
</Grid>
cs
复制代码
public ICommand SaveCommand { get; }
public ICommand RefreshCommand { get; }
public ICommand CloseCommand { get; }
public ICommand TestCommand { get; }
public MainViewModel()
{
SaveCommand = new RelayCommand(() => { });
RefreshCommand = new RelayCommand(() => { });
CloseCommand = new RelayCommand(() => Application.Current.Shutdown());
TestCommand = new RelayCommand(() => { });
}