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(() => { });
}
相关推荐
nashane4 小时前
HarmonyOS 6.0 分布式数据实战:KVStore跨设备同步与高性能查询指南(API 11 Stage模型)
wpf·harmonyos 5
SEO-狼术1 天前
Easily Reorder Rows in WPF Grids
wpf
烟话65 天前
MVVM核心机制:属性通知与命令绑定解析
wpf
不知名君5 天前
WPF 的原生窗体标题栏主题自适应系统深浅主题
wpf
碎碎念的安静5 天前
WPF 与 Qt 进程间通信(IPC)
开发语言·qt·wpf
军训猫猫头6 天前
7.带输入参数的线程启动 C# + WPF 完整示例
开发语言·前端·c#·.net·wpf
周杰伦fans7 天前
WPF Prism 框架完全入门指南:从环境搭建到弹窗导航实战
wpf
雨浓YN7 天前
WPF MVVM 模式(无调库)项目创建笔记
笔记·wpf
周杰伦fans7 天前
.NET AOT技术深度解析:为什么WPF不支持而Avalonia/UWP支持?
.net·wpf