3. 命令Command 簡單理解(待更新)

来源:https://www.cnblogs.com/wsnanxixi/archive/2018/01/10/8260350.html
-Advertisement-
Play Games

命令(Command) 2018/1/10 19:06:35 命令可以約束代碼,還可以約束步驟邏輯。(事件的作用是發佈和傳播一些消息,對如何響應事件不做規定,每個接收者可以使用自己的行為來響應事件。也就是說事件不具有約束力) 命令系統的基本元素 ·命令(Command):實際上就是實現了IComma ...


命令(Command)

2018/1/10 19:06:35

命令可以約束代碼,還可以約束步驟邏輯。(事件的作用是發佈和傳播一些消息,對如何響應事件不做規定,每個接收者可以使用自己的行為來響應事件。也就是說事件不具有約束力)

命令系統的基本元素

·命令(Command):實際上就是實現了ICommand介面的類,平時使用最多的是RoutedCommand類
·命令源(Command Source):實現了ICommandResource介面的類(Button)
·命令目標(Command Target):必須是實現了IInputCommand介面的類
·命令關聯(Command Binding):負責把外圍邏輯與命令關聯起來,比如執行之前對命令是否可以執行進行判斷、命令執行後還有哪些後續工作等

命令的使用

1.創建命令類

即獲得一個實現ICommand介面的類,如果命令與具體業務邏輯無關,則使用WPF類庫中的RoutedCommand即可。如果想得到與業務邏輯相關的專有命令,則需要創建RoutedCommand(或者ICommand)的派生類。

2.聲明命令實例

技巧:一般情況下,只需要操作一個命令實例與之對應即可。因此程式中的命令多使用單件模式(Singletone Pattern)以減少代碼複雜度。

3.指定命令源

命令源擁有命令和命令源兩個屬性。
同一個命令可以有多個源。
一旦把命令指派給命令源,命令源就會受命令影響,命令不能執行的時候作為命令源的控制項不可用。革命臨官發送命令的方式不盡相同,例如單機雙擊。

4.指定命令目標

命令目標不是命令的屬性而是命令源的屬性。無論這個命令源是否擁有焦點都會收到這個命令。如果沒有指定命令目標,預設為當前焦點對象就是命令目標。

5.設置命令關聯(命令綁定)

WPf需要CommandBinding在執行前幫助判斷是不是可以執行,在執行後做一些事件來“打掃戰場”。命令目標向命令關聯發送路由事件,命令關聯捕捉並處理路由事件,向命令反饋信息。

1.ICommand介面包含兩個方法和一個事件

Execute()方法包含應用程式邏輯(例如列印文檔);
CanExecute()方法返回命令狀態(命令可用返回true,不可用返回false);
CanExecuteChanged事件,命令狀態改變時引發,這是指示信號,表示應當調用CanExecute()檢查命令狀態。

2.RoutedCommand類自動實現ICommmand介面的類

不包含任何應用程式邏輯,只代表命令。為事件冒泡和隧道添加了一些額外的基礎結構

3.RoutedUICommand類繼承自RoutedCommand類

用於具有文本的命令,只增加了Text屬性

執行命令

RoutedUIIcommand類沒有任何編碼的功能,只表示命令。為觸發命令,需要有命令源(也可使用代碼)。為響應命令,需要有命令綁定,命令綁定將執行轉發給普通的事件處理程式。

1.命令源

ICommandSource定義了三個屬性:
·Command:指向連接的命令,必需
·CommandParameter:提供其他希望隨命令發送的數據
·CommandTarget:確定將在其中執行命令的元素
例如:下麵的按鈕使用Command屬性連接到ApplicationCommands.New命令:

<Button Command="ApplicationCommands.New">New</Button>
2.命令綁定

明確:
·當命令被觸發時執行什麼操作
·如何確定命令是否能被執行(可選)
·命令在何處起作用

命令實例:

定義一個命令,使用Button來發送這個命令,當命令送達TextBox時,TextBox被清空(如果沒有文字則不發送命令)
·界面代碼:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Command"
    Background="LightBlue" Height="350" Width="525">
<StackPanel x:Name="stackPanel">
    <Button x:Name="button1" Content="Send Command" Margin="5"/>
    <TextBox x:Name="textBoxA" Margin="5,0" Height="100"/>
</StackPanel>
</Window>

·後臺代碼:

//實現:定義一個命令,使用Button來發送這個命令,當命令送達TextBox時,TextBox被清空(如果沒有文字則不發送命令)

namespace WpfApplication1
{
/// <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.button1.Command = this.clearCmd;
        this.clearCmd.InputGestures.Add(new KeyGesture(Key.C, ModifierKeys.Alt));//按Alt+C鍵

        //指定命令目標
        this.button1.CommandTarget = this.textBoxA;

        //創建命令關聯
        CommandBinding cb = new CommandBinding();
        cb.Command = this.clearCmd;//只關註與clearCmd相關的事件
        cb.CanExecute += new CanExecuteRoutedEventHandler(cb_CanExecute);
        cb.Executed +=new ExecutedRoutedEventHandler(cb_Executed);

        //把命令關聯安置在外圍控制項上
        this.stackPanel.CommandBindings.Add(cb);
    }

    //當探測命令是否可以執行時,此方法被調用
    void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        if(string.IsNullOrEmpty(this.textBoxA.Text))
        { e.CanExecute = false; }
        else
        { e.CanExecute = true; }

        //避免繼續向上傳而降低程式性能
        e.Handled = true;
    }

    //當命令送達目標後,此方法被調用
    void cb_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        this.textBoxA.Clear();
        //避免繼續向上傳而降低程式性能
        e.Handled = true;
    }
}

解釋:
·運行程式,在TextBox中輸入文字後Button在命令可執行狀態的情況下變為可用,此時單擊Button或者按Alt+C鍵,TextBox都會被清空。
·RoutedCommand並不對命令目標做任何操作,而是由CommandBinding操作的。
·無論是探測命令是否執行還是命令送達目標,都會激發命令目標發送路由事件,這些路由事件會沿著UI元素樹向上傳遞並最終被CommandBinding所捕捉。
·CommandBinding被安裝在外圍的StackPanel上,CommandBinding起一個偵聽器的作用,而且專門針對clearCmd命令捕捉與其相關的路由事件。
·當CommandBinding捕捉到CanExecute事件,就會調用cb_CanExecute方法判斷命令執行條件是否滿足,並反饋給命令供其影響命令源的狀態;當捕捉到Execute事件,表示命令的Execute方法已經執行了,或者說命令已經作用在了命令目標上(RoutedCommand只負責讓命令目標激發Executed),則調用Executed方法。
·CommandBingding一定要設置在命令目標的外圍控制項上,不然無法捕捉到CanExecute和Executed等路由事件。

命令庫

命令具有“一處聲明,處處使用”的特點。便攜的命令庫包括:ApplicationCommands,ComponentCommands,NavigationCommands,MediaCommands,EditingCommands.都是靜態類。例如我們可以直接拿命令庫用這些標準命令,不需要自己聲明:Open,Save,Play,Stop。(屬於ApplicationCommand)

自定義Command

---------------------待更新


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 在去年的時候,在各種渠道中略微的瞭解了SpringBoot,在開發web項目的時候是如何的方便、快捷。但是當時並沒有認真的去學習下,畢竟感覺自己在Struts和SpringMVC都用得不太熟練。不過在看了很多關於SpringBoot的介紹之後,並沒有想象中的那麼難,於是開始準備學習Spring ...
  • Python 語音:與機器進行語音交流,讓機器明白你說什麼,這是人們長期以來夢寐以求的事情。 語音識別是一門交叉學科。近二十年來,語音識別技術取得顯著進步,開始從實驗室走向市場。人們預計,未來10年內,語音識別技術將進入工業、家電、通信、汽車電子、醫療、家庭服務、消費電子產品等各個領域。 語音識別... ...
  • Java在如今的發展趨勢而言,一直都是處於流行的原因自然也是隨之而存在的。 java的特點如下幾個方面: 1.簡單性 Java 實際上是一個 C++去掉了複雜性之後的簡化版。如果讀者沒有編程經驗,會發現 Java 並不難掌握, 而如果讀者有 C 語言或是 C++語言基礎,則會覺得 Java 更簡單, ...
  • 一、Wtform WTForms是一個支持多個web框架的form組件,主要用於對用戶請求數據進行驗證。 安裝: pip3 install wtform 用途: 1. 用戶登錄註冊 當用戶登錄時候,需要對用戶提交的用戶名和密碼進行多種格式校驗。如: 用戶不能為空;用戶長度必須大於6; 用戶不能為空; ...
  • 前幾天遇到一個約瑟夫環演算法的問題,因為當時時間緊,而且之前也沒接觸過這個演算法,也就沒有太深究。今天有時間想起來這個問題了,就研究了一下,寫了一段代碼,試了一下,結果應該是正確的,記錄一下,以後用的時候也好找。下麵一段摘自百度百科。 約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2 ...
  • "回到目錄" 職責鏈模式 它是一種設計模塊,主要將操作流程與具體操作解耦,讓每個操作都可以設置自己的操作流程,這對於工作流應用是一個不錯的選擇! 下麵是官方標準的定義:責任鏈模式是一種設計模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一 ...
  • 基於WebImage封裝圖片上傳工具類,支持縮略圖和水印及其簡單的配置。 ...
  • 最近在做一部分Pyhton代碼轉c#代碼的工作,以下案例親自都測試過,現整理出來希望對有幫助的同學提供參考: Python | C# ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...