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(() => { });
}
相关推荐
dalong1014 小时前
WPF:3D顶点共享与法线设置对光照效果的影响
3d·wpf
柔蘭1 天前
WPF中的CommunityToolkit.Mvvm框架
wpf
aGdF8E3gQ2 天前
【Application Insights】采样率对Function App日志收集的影响和解决方法
python·flask·wpf
程序员-Benothing2 天前
如何实现高并发系统订单30分钟自动关闭?
开发语言·c#·wpf
一水3 天前
Redis实战:一个AI工作流系统里的五个应用场景,从传参到限流的完整链路
数据库·redis·wpf
dalong103 天前
WPF:3D甜甜圈
3d·c#·wpf·甜甜圈
别催小唐敲代码3 天前
ROS2从入门到实战:去中心化机器人操作系统详解
wpf·ros2
脚踏实地皮皮晨4 天前
003006001_WrapPanel控件
开发语言·c#·.net·wpf·visual studio
脚踏实地皮皮晨4 天前
003005002_WPF StackPanel 基类官方类定义逐行深度解析
开发语言·windows·算法·c#·wpf·visual studio
脚踏实地皮皮晨4 天前
003004002_UniformGrid控件的使用方法
开发语言·c#·.net·wpf·visual studio