深入淺出話命令(Command)-筆記(-) 一 基本概念 命令的基本元素: 命令的使用步驟: 二 小試牛刀 實現這樣一個需求:定義一個命令,使用Button 來發送這個命令,當命令到達Textbox時,清空Text(當Textbox為空時,Button不可用)。 XAML代碼: CS代碼: 運行效 ...
深入淺出話命令(Command)-筆記(-)
一 基本概念
命令的基本元素:
- 命令(Command):實現了ICommand介面的類,平常使用最多的是RoutedCommand類。
- 命令源(Command Source):命令的發送者,實現了ICommandSource介面的類。
- 命令目標(Command Target):命令的執行者。,實現了IInputElement介面的類。
- 命令關聯(Command Binding):把外圍邏輯與命令關聯起來。
命令的使用步驟:
- 創建命令類:創建一個實現ICommand介面的類。
- 申明命令實例:實例一個命令類對象。某種操作只需實例化一個對象然後與之對應(單件模式)。
- 指定命令源:指定誰來發送命令。
- 指定命令目標:指定誰來執行命令。並不是命令屬性,而是命令源屬性。
- 設置命令關聯:判斷命令是否可執行,執行完成後採取的動作等。
二 小試牛刀
實現這樣一個需求:定義一個命令,使用Button 來發送這個命令,當命令到達Textbox時,清空Text(當Textbox為空時,Button不可用)。
XAML代碼:
<Window x:Class="CommandApplication.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:CommandApplication" mc:Ignorable="d" Title="MainWindow" Height="175" Width="200"> <StackPanel x:Name="stackPanel"> <Button x:Name="button1" Content="Send Command" Margin="5"/> <TextBox x:Name="textBoxA" Margin="5,0" Height="100"/> </StackPanel> </Window>
CS代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; 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 CommandApplication { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); InitializeCommand(); } //RoutedCommand 是系統自帶常用的命令類 //申明命令實例 private RoutedCommand clearCmd = new RoutedCommand("Clear", typeof(MainWindow)); private void InitializeCommand() { //指定命令源 this.button1.Command = this.clearCmd; this.clearCmd.InputGestures.Add(new KeyGesture(Key.C, ModifierKeys.Alt)); //指定命令目標,命令源屬性中指定s this.button1.CommandTarget = this.textBoxA; //創建命令關聯 CommandBinding cb = new CommandBinding(); cb.Command = this.clearCmd; cb.CanExecute += new CanExecuteRoutedEventHandler(cb_CanExecute); cb.Executed += new ExecutedRoutedEventHandler(cb_Execute); //this.stackPanel.CommandBindings.Add(cb); this.textBoxA.CommandBindings.Add(cb); } //當命令送達目標後,此方法被調用 private void cb_Execute(object sender, ExecutedRoutedEventArgs e) { this.textBoxA.Clear(); e.Handled = true; } //當探測命令是否可執行時,此方法被調用 private void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e) { if (string.IsNullOrEmpty(this.textBoxA.Text)) { e.CanExecute = false; } else { e.CanExecute = true; } e.Handled = true; } } }
運行效果: