WPF之命令

WPF之命令

WPF命令系统由以下几个基本要素构成:

  • 命令对象,实现了ICommand接口的类,一般用RoutedCommand类

  • 命令源,命令的发送者,是实现了ICommandSource接口的类,很多界面元素都实现了该接口,包括Button,MenumItem,ListBoxItem

  • 命令目标,命令作用在谁身上,必须实现了InputElement接口的类

  • 命令关联,即CommandBinding类,负责将一些外围的逻辑与命令关联起来,比如执行之前是否可以执行,命令执行之后还有哪些后续工作。

WPF命令搭建步骤

命令对象,可以通过其属性InputGestures的Add方法添加快捷键。

命令目标的Command属性设定为命令对象,标明要发出的命令,对于要响应多种命令对象的情况,其解决方案是将该属性进行绑定,binding,当命令不可执行的时候,命令目标处于不可用的状态;命令目标的CommandTarget属性设定为命令目标,如果不进行设置,则有焦点的就设定为命令目标。

命令关联的Command属性设定为命令对象,标明关注该命令,其CanExecute事件绑定了是否可以执行的代码;其Executed事件绑定了命令执行代码;将该命令关联安置在外围控件上,其方法为外围控件的BindingCommandsAdd方法。

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处于不可用的状态。

posted @ 2022-04-19 23:44  JohnYang819  阅读(204)  评论(0编辑  收藏  举报