WPF InputBindings MVVM详解

一、概述

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 手动触发命令

八、InputBindings 优势总结

  1. MVVM 友好,无代码后置,纯声明式
  2. 自动响应 CanExecute,自动禁用 / 启用
  3. 支持全局 / 局部热键
  4. 支持键盘 + 鼠标 + 修饰键任意组合
  5. 可复用、可维护、可测试

九、完整可直接运行示例(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(() => { });
}
相关推荐
czhc11400756631 天前
wpf 511 封装通信类 半导体协议:SECS
wpf
lingxiao168881 天前
WPF数据采集和监控(Industrial)
wpf
雨浓YN1 天前
GKTGD 工业监控系统-02MySQL 数据库技术文档(类库:NET8_SQLData)
数据库·wpf
雨浓YN1 天前
GKTGD 工业监控系统-03SQLite 数据库技术文档(类库:NET8_SQLData)
数据库·wpf
deokoo1 天前
.NET WPF 工程离线迁移完整指南:告别“包降级”与assets文件缺失
wpf
雨浓YN1 天前
GKTGD 工业监控系统-04MySQL 与 SQLite 数据库对比(类库:NET8_SQLData)
数据库·sqlite·wpf
Bofu-2 天前
【内存测试】06-WPF 读取 SMBIOS 实现内存规格自动检测
wpf·p/invoke·windows api·smbios·内存检测·dimm·硬件信息读取
Bofu-2 天前
【Storage存储测试】07-WPF 通过 WMI + NVMe SMART 实现 SSD 规格自动验证
wpf·nvme·wmi·smart·ssd检测
Bofu-2 天前
【键盘测试】05-WPF 可视化键盘布局配置 + 全局钩子按键检测实战
wpf·键盘测试·全局键盘钩子·scancode·组合键检测
bugcome_com2 天前
WPF 路径动画完全指南:自绘制控件实战
wpf