目的:了解一下CommandBindings、InputBindings、ICommandSource中在WPF中扮演什么样的角色
CommandBindings:
将应用程序要执行的功能封装到中间层组件或独立的类中:可以将所有命令统一封装,统一管理,统一调用
定义过程:
//将所有命令封装在一个类里面
public class MyCommands
{
public static RoutedUICommand MyCommand = new RoutedUICommand();
public static void DoCommand()
{
MyCommand.Execute("erer",null);
}
}
说明:定义一个类用来存放所有Binding命令,定义一个MyCommand命令供页面使用
Xaml中注册定义的命令:
<!--第一步,将整个窗口要用到的命令注册-->
<UserControl.CommandBindings>
<CommandBinding Command="local:MyCommands.MyCommand"
Executed="CommandBinding_Executed"
CanExecute="CommandBinding_CanExecute"/>
<!--如果CanExecute返回false则注册该命令的所有控件是不可用的-->
</UserControl.CommandBindings>
Xaml中将命令赋值到需要调用该命令的ICommandSource对象
<Grid>
<StackPanel>
<Menu>
<!--实现了ICommandSource接口的控件都可以直接赋值到Command命令上-->
<MenuItem Command="local:MyCommands.MyCommand"
Header="menu"
CommandParameter="1111" />
</Menu>
<Button Command="local:MyCommands.MyCommand" Height="50" Content="执行命令"
CommandParameter="button"
Grid.Row="1"/>
<CheckBox Content="控制MyCommand是否可以执行" x:Name="cb" IsChecked="True"/>
<Button Content="外部触发命令" Click="Button_Click"/>
</StackPanel>
</Grid>
ICommandSource对象 Command="local:MyCommands.MyCommand" 赋值会触发注册的MyCommand命令
注意:
<CommandBinding Command="local:MyCommands.MyCommand"
Executed="CommandBinding_Executed"
CanExecute="CommandBinding_CanExecute"/>
Command只能传入静态的命令,并通过Executed、CanExecute注册要实现的事件,不可以{Binding }到ViewModel
KeyBinding:
可以直接注册快捷键、鼠标
<UserControl.InputBindings>
<KeyBinding Command="local:MyCommands.MyCommand" Key="T" Modifiers="Alt"/>
</UserControl.InputBindings>
说明:将快捷键Alt+T注册到命令local:MyCommands.MyCommand上,也可以对Command 执行{Binding}到ViewModel,本质上也是一个ICommandSource对象
也可以用在Xaml中这样写
<UserControl.Resources>
<RoutedUICommand x:Key="Cut" Text="剪切" />
<RoutedUICommand x:Key="Copy" Text="复制" />
<RoutedUICommand x:Key="Paste" Text="粘贴" />
<RoutedUICommand x:Key="Select" Text="全选" />
</UserControl.Resources>
<UserControl.InputBindings>
<KeyBinding Gesture="Ctrl+X" Command="{StaticResource Cut}" />
<KeyBinding Gesture="Ctrl+C" Command="{StaticResource Copy}" />
<KeyBinding Gesture="Ctrl+V" Command="{StaticResource Paste}" />
</UserControl.InputBindings>
<UserControl.CommandBindings>
<CommandBinding Command="{StaticResource Cut}" Executed="CommandBinding_Cut"></CommandBinding>
<CommandBinding Command="{StaticResource Copy}" Executed="CommandBinding_Copy"></CommandBinding>
<CommandBinding Command="{StaticResource Paste}" Executed="CommandBinding_Paste"></CommandBinding>
</UserControl.CommandBindings>
## 更多学习官方文档
System.Windows.Controls 命名空间 | Microsoft Learn
## 更多查看官方在线源码
https://referencesource.microsoft.com/?wt.mc_id=MVP_380318