繼續聊WPF 自定義命令

2022-01-10 12:30:49 字數 2017 閱讀 8891

作為春節前的最後一篇技術文章,寫點什麼呢?想了一下,就聊聊wpf中的命令吧。

命令這東西很有意思,簡明一點說,它是一種邏輯,但這種邏輯可以被多種源呼叫,可以作用於多種目標上。如我們常見的「複製」,「剪下」等命令,它們本身就是一種邏輯——對剪下板進行操作的邏輯行為,不過,你會發現,它們不僅可以在選單項中使用,也可以在工具欄按鈕上使用,也可以通過快捷鍵ctrl +  c等來呼叫。

選單項工具欄按鈕

從上面的舉例可以發現,命令可以使用具備相同功能的**邏輯變得通用化,就像我們封裝了乙個類一樣,可以在n個地方進行呼叫,這樣我們不必每次都寫相同的**。

.net類庫已為我們準備了許多通用命令,使用起來也很簡單,這裡就不說了,大家可以參考msdn上相關說明,本文的主題是自定義命令,在講述自定義命令之前,先了解一下與命令有關的幾個要素,就像我們常說的「記敘文六要素」一樣,乙個完整的命令應當包括:

1、命令,這當然是核心部分了;

2、命令源:命令是誰發出的;

3、目標,命令作用在哪些元素上,如往文字框中貼上內容,那麼該textbox就是命令目標;

嚴格上說,命令是實現了icommand介面的類,但是,在際使用中,我們不必這樣做,一種有效的方法是在某個類中直接宣告乙個routecommand類的成員字段即可,一般使用static關鍵字,這樣可以使得命令只與類有關,而不必理會其屬於哪個例項。

下面,我們一起動手完成乙個例項:

1、新建乙個wpf應用程式,如何新建?(略);

2、布局好主窗體,我們重點是需要兩個文字框和乙個按鈕,其它的自己喜歡;

3、使用commadbinding把命令新增到窗體類的commandbindings集合中。

4、在按鈕上設定command屬性。

在上面的xaml中,我們要注意的是,要引入我們定義了路由命令的類所在的命名空間。

接下來,我們要編寫兩個事件處理程式——canexecute確定命令是否可用;executed命令邏輯應寫在這裡。

這樣我們會有乙個疑問,事件的引發者是誰?命令目標又是誰?

我們在executed事件處理程式的開始處下乙個斷點,然後單步跟入。

得到的結果如下:

sender是主窗體。

executedroutedeventargs的source屬性就是命令目標。

但是,當我們執行的時候,我們發現字型變成藍色的並不是文字框,而是按鈕,為什呢?

我們仔細閱讀一下msdn文件及相關說明就知道了,因為我們沒有設定target,所以,預設的是當前獲得焦點的元素將成為命令目標。

下面我們改乙個上面的xaml讓button的commandtarget指向第二個文字框。

現在執行一下,可以發現,點選按鈕後,第二個文字框的前景色就變成藍色了。

canexecute事件和executed事件都是路由事件,當然,routecommand類也包含遂道事件,至於什麼是路由事件,什麼是遂道事件,不在本文講述的範圍之中。

以路由事件為例,下面我們來做第二個示例。這個示例,窗體上有乙個stackpanel,裡面包含乙個按鈕,同時,把commandbinding新增到該stackpanel上,而該stackpanel裡面再巢狀乙個dockpanel,同樣,把同乙個命令也新增到dockpanel上,dockpanel裡面再包含乙個canvas,但是canvas不新增commandbinding,然後,在executed事件處理程式中分別輸出引發事件的型別,命令目標型別和目標的name屬性的值。

[xaml]

[c# code]

然後,我們執行程式,依次點選這三個按鈕,接著開啟「輸出」視窗觀察一下。

得到的結果如下:

發現了什麼?從除錯資訊中看到,後兩次執行命令,引發事件的型別都是dockpanel,這也符合路由事件沿視覺化樹往上冒泡的原則了。

因為canvas中我們沒有繫結命令,所以在canvas上無法引發事件,於是,向上路由到dockpanel,所以後兩次事件的觸發者都是dockpanel。

接下來,我們還要動手做第三個示例,示例不通過控制項來執行命令,而是通過快捷鍵ctrl + alt + y來啟用。

執行程式,當視窗處於活動狀態,然後按下ctrl + alt + y,你就看到效果了。

WPF自定義命令

wpf的自定義命令實現過程包括三個部分,定義命令 定義命令源 命令呼叫,實現如下 public partial class mainwindow window 自定義命令演示 public void testuserdefinecommand public class userdefinecomma...

繼續聊WPF 數字墨跡A

今天晚上,我為大家準備了一項很好玩的東西,相信大家以前在使用ms office的也時候也用過手寫輸入,或者用畫圖軟體,應該對手寫感知不陌生了,尤其是手機,很多機子都有觸屏手寫功能。在以前,要實現手繪功能是很痛苦的,但是,告訴你乙個好訊息,在wpf裡面,你會非常輕鬆就能實現這功能,信不信由你,反正我信...

WPF 自定義面板

先上效果圖吧 實現自定義面板主要實現兩個方法 一 measureoverride 用於計算容器內部元素大小,這個很簡單,略過 二 arrangeoverride 用於計算容器內部元素位置和其他顯示方式,以下是實現上面布局的 protected override system.windows.size...