目的:通过模仿TextBox中Ctrl+C等快捷键原理来了解CommandBindings实现原理,可以通过此示例了解ApplicationCommands.Copy在TextBox中实现的原理
一、定义一个自己的MyCommands.Delete
class MyCommands
{
public static RoutedUICommand DeleteCommand = new RoutedUICommand();
}
二、定义一个TextBoxControl控件来封装TextBox并包含Ctrl+D删除文本内容
XAML部分:
<UserControl.InputBindings>
<KeyBinding Command="local:MyCommands.DeleteCommand" Key="D" Modifiers="Ctrl"/>
</UserControl.InputBindings>
<Grid>
<StackPanel Orientation="Horizontal">
<TextBlock Text="按住Ctrl+D删除文件内容" Width="200"/>
<TextBox x:Name="tb_content" Text="请输入文本" Width="200"/>
</StackPanel>
</Grid>
CS部分:
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
this.tb_content.Text = string.Empty;
}
private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = !string.IsNullOrEmpty(this.tb_content.Text);
}
此时的TextBoxControl即可实现Ctrl+D删除文本中内容
三、同AppliactionCommands一样,MyCommands也可以在外部调用并动态更新控件IsEnbled
定义一个MainWindow放置TextBoxControl并定义按钮绑定自定义的MyCommand.DeleteCommand和系统中ApplicationCommands.Copy
<Grid>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<Menu>
<MenuItem Header="删除" Command="local:MyCommands.DeleteCommand"/>
<MenuItem Header="剪切" Command="ApplicationCommands.Copy"/>
</Menu>
<local:TextBoxControl x:Name="tb"/>
<ToolBar>
<Button Content="删除" Command="local:MyCommands.DeleteCommand"/>
<Button Content="剪切" Command="ApplicationCommands.Copy"/>
</ToolBar>
</StackPanel>
</Grid>
通过示例可以看到自定义的MyCommands和ApplicationCommands中效果一致
效果如下:(剪切实际上是复制,不必多想,很单纯的文本写错了)
值得注意的需要通过1、menu item 2、toolbar 3、shortcut中使用
如果要用Button等其他控件需要设置CommandTarget
<Button Content="删除" Command="local:MyCommands.DeleteCommand" CommandTarget="{Binding ElementName=tb}"/>