WPF之命令
WPF之命令
WPF命令系统由以下几个基本要素构成:
-
命令对象,实现了ICommand接口的类,一般用RoutedCommand类
-
命令源,命令的发送者,是实现了ICommandSource接口的类,很多界面元素都实现了该接口,包括Button,MenumItem,ListBoxItem
-
命令目标,命令作用在谁身上,必须实现了InputElement接口的类
-
命令关联,即CommandBinding类,负责将一些外围的逻辑与命令关联起来,比如执行之前是否可以执行,命令执行之后还有哪些后续工作。
WPF命令搭建步骤
命令对象,可以通过其属性InputGestures
的Add方法添加快捷键。
命令目标的Command
属性设定为命令对象,标明要发出的命令,对于要响应多种命令对象的情况,其解决方案是将该属性进行绑定,binding,当命令不可执行的时候,命令目标处于不可用的状态;命令目标的CommandTarget
属性设定为命令目标,如果不进行设置,则有焦点的就设定为命令目标。
命令关联的Command
属性设定为命令对象,标明关注该命令,其CanExecute
事件绑定了是否可以执行的代码;其Executed
事件绑定了命令执行代码;将该命令关联安置在外围控件上,其方法为外围控件的BindingCommands
的Add
方法。
Demo
<Window x:Class="routedCommandDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:routedCommandDemo"
mc:Ignorable="d"
Title="MainWindow" Height="175" Width="260">
<Grid x:Name="grid">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button x:Name="btn" Grid.Row="0" Content="Clear Text"/>
<TextBox x:Name="textBox" Grid.Row="1"/>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace routedCommandDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
InitializeCommand();
}
private RoutedCommand clearCmd = new RoutedCommand("Clear", typeof(MainWindow));//声明命令类
private void InitializeCommand()
{
this.btn.Command = clearCmd;//命令源
this.clearCmd.InputGestures.Add(new KeyGesture(Key.C, ModifierKeys.Alt));//指定快捷键
this.btn.CommandTarget = this.textBox;//命令源的目标是textBox
CommandBinding cb = new CommandBinding();//创建命令绑定对象
cb.Command = clearCmd;//只关注clearCmd
cb.CanExecute += Cb_CanExecute; ;//注册CanExecute事件
cb.Executed += Cb_Executed;//注册Executed事件
//容易忽视的一步,将CommandBinding安装到外围
this.grid.CommandBindings.Add(cb);
}
private void Cb_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
if (string.IsNullOrEmpty(this.textBox.Text))
{
e.CanExecute = false;
}
else
{
e.CanExecute = true;
}
e.Handled = true;//避免继续向上传播而降低程序性能
}
private void Cb_Executed(object sender, ExecutedRoutedEventArgs e)
{
this.textBox.Clear();
e.Handled = true;//避免继续向上传播而降低程序性能
}
}
}
如上图,当textBox中无内容时,btn处于不可用的状态。
#####
愿你一寸一寸地攻城略地,一点一点地焕然一新
#####