日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > WPF Commend 命令

WPF Commend 命令

來源:程序員人生   發布時間:2015-04-25 09:47:59 閱讀次數:6384次

    WPF為我們準備了完善的命令系統,你可能會問:“有了路由事件為何還需要命令系統呢?”。事件的作用是發布、傳播1些消息,消息轉達到了接收者,事件的指令也就算完成了,至于如何響應事件送來的消息事件其實不做任何限制,每一個接收者可已用自己的行動來響應事件。也就是說,事件不具有束縛力。命令和事件的區分就在于命令具有束縛力


1. WPF中命令的組成元素和元素之間的關系


下面直接給出其組成元素:
?命令(Command)實現了ICommand接口的類,使用比較多的是RoutedCommand

?命令源(Command Source)命令的發送者,現實了ICommandSource接口的類,實現此類的元素主要有ButtonBase,Hyperlink,MenuItem、ListBoxItem等

?命令目標(Command Target)命令的接受者,實現了IInputElement接口的類。

?命令關聯(Command Binding)負責把外圍的邏輯與命令關聯起來。


    相對事件的元夙來說,命令元素之間的關系還是會復雜1些,具體的關系會通過命令的使用來講明。下面先簡單介紹1下自定義命令的步驟。 


a、創建命令類
    如果命令沒有觸及到業務邏輯的話,1般使用WPF類庫的RoutedCommand類便可,如果要聲明相對邏輯復雜1些的類,可以實現RouteCommand類的繼承或是ICommand的接口。

b、聲明命令實例
    由于命令的普遍性,1般情況下程序中某類命令只需要1個命令實例便可(單件模式)。

c、指明命令的源
    通常是可以點擊的控件,命令還有個好處就是,沒有準備好的命令,這個控件不可用。如果把命令看作炮彈,那末命令源相當于火炮,這個火炮還是防走火的。

d、指明命令的目標
    目標是命令的作用對象。如果指定了目標,不管是不是有焦點,都會遭到這個命令。如果沒有指定目標的話,具有焦點的對象默許為命令目標。還有1個要注意的是設置目標是通過命名的源來設置的。格式為:命令源控件.CommandTarget = 目標控件;

e、設置命令關聯
    關于設置命令關聯還是在實例中好好的體會1下吧。下面就通過1個例子來講明。



2. 小試命令


下面的例籽實現的是點擊按鈕時,清除文本框里面的內容。由于代碼注釋寫的比較詳細,直接給代碼,然后具體再解釋:

XAML:

<Window x:Class="WpfApplication9.wnd913" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="200" Width="525"> <StackPanel x:Name="_stackPanel" Background="LightSlateGray"> <Button x:Name="_btnClear" Content="Clear" Height="28" Margin="5"/> <TextBox x:Name="_txtBox" Height="120"/> </StackPanel> </Window>

C#:

public partial class wnd913 : Window { /// <summary> /// 聲明并定義命令 /// </summary> private RoutedCommand _clearCmd = new RoutedCommand("clear", typeof(wnd913)); public wnd913() { InitializeComponent(); // 指定命令源與快捷鍵(輸入筆勢) _btnClear.Command = _clearCmd; _clearCmd.InputGestures.Add(new KeyGesture(Key.C, ModifierKeys.Alt)); // 指定命令目標 _btnClear.CommandTarget = _txtBox; // 創建命令關聯 CommandBinding cb = new CommandBinding(); cb.Command = _clearCmd; cb.CanExecute += cb_CanExecute; cb.Executed += cb_Executed; // 命令關聯安置到外圍控件上 _stackPanel.CommandBindings.Add(cb); } void cb_Executed(object sender, ExecutedRoutedEventArgs e) { _txtBox.Clear(); // 履行終了 e.Handled = true; } void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e) { if(string.IsNullOrEmpty(_txtBox.Text)) { e.CanExecute = false; } else { e.CanExecute = true; } } }


第1,使用命令可以免自己寫代碼判斷Button是不是可以用和添加快捷鍵。


第2,RountedCommand是1個與業務邏輯無關的類,只負責在程序中跑腿而其實不對命令目標進行操作,TextBox其實不是由它清空的。那末TextBox的情況操作是誰呢?答案是CommandBinding。由于不管是探測命令是不是可以履行還是命令投遞目標,都會激起命令目標發送路由事件,這些事件會沿著UI元素樹向上傳遞,終究被CommandBinding所捕捉。本例中CommandBinding被安裝在外圍的StackPanel上,Commandbinding站在高處起1個偵聽器的作用,而且專門針對rouutedCommand命令捕捉與其相干的事件。本例中,當CommandBinding捕捉到CanExecute就會調用cb_CanExecute方法。當捕捉到是Executed的時候,就調用cb_Execute事件。


第3,由于CanExecute事件的激起頻率比較高,為了不下降性能,在處理終了以后建議將e.Handle設置為true。


第4,CommandBinding1定要設置在命令目標的外圍控件上,不然沒法捕捉CanExecute和Executed等路由事件。


3. WPF命令庫


    命令具有1處聲明,處處使用的特點,比如Save命令,在程序的任何地方它都表示要求命令目標保存數據。因此,微軟在WPF類庫里面準備了1些便捷的命令庫,這些命令庫包括:


ApplicationCommands
ComponentCommands
NavigationCommands
MediaCommands
EditingCommands


    它們都是靜態類,而命令就是由這些靜態類的只讀屬性以單件模式暴露出來的。例如:ApplicationCommands類就包括CancelPrint、Close、ContextMenu、Copy、CorrectionList、Cut、Delete、Find、Help、New、NotACommand、Open、Paste、Print、PrintPreview、Properties、Redo、Replace、Save、SaveAs、SelectAll、Stop、Undo這些命令。


    這就引發了1個問題:如果界面上有兩個按鈕1個用來創建Student檔案,1個用來創建Teacher檔案。都使用New命令的話,程序應當如何區分新建的是甚么檔案呢?


    答案是使用CommandParameter,命令源1定是實現了ICommandSource接口的對象,而ICommandSource有1個屬性就是CommandParameter,如果把命令看做飛向目標的炮彈,那末CommandParameter就相當于裝載在炮彈里面的“消息”。下面是程序的實現代碼。


XAML:

<Window x:Class="WpfApplication9.wnd914" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="wnd914" Height="219.231" Width="300"> <StackPanel x:Name="_stackPanel" Margin="5"> <TextBox x:Name="_txtBox" Margin="5"/> <Button x:Name="_btn1" Content="Teacher" Margin="5"/> <Button x:Name="_btn2" Content="Student" Margin="5"/> <ListBox x:Name="_listBox" Height="70" Margin="5"/> </StackPanel> </Window>

C#:

public partial class wnd914 : Window { public wnd914() { InitializeComponent(); _btn1.Command = ApplicationCommands.New; _btn1.CommandParameter = "Teacher"; _btn2.Command = ApplicationCommands.New; _btn2.CommandParameter = "Student"; CommandBinding cb = new CommandBinding(); cb.Command = ApplicationCommands.New; cb.CanExecute += cb_CanExecute; cb.Executed += cb_Executed; _stackPanel.CommandBindings.Add(cb); } void cb_Executed(object sender, ExecutedRoutedEventArgs e) { _listBox.Items.Add(e.Parameter.ToString()); } void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e) { if (string.IsNullOrEmpty(_txtBox.Text)) { e.CanExecute = false; } else e.CanExecute = true; } }


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产精品一卡 | 污视频免费在线观看 | 91 久久 | 成人午夜免费视频 | 国产日韩欧美视频 | 免费h片网站 | 簧片免费在线观看 | 亚洲成人1区 | 欧美成人毛片 | 亚洲国产精品国自产拍av秋霞 | 国产黄色在线播放 | 又黄又免费的视频 | 亚洲视频精品在线 | 另类激情亚洲 | 国产中文字幕一区二区三区 | 成人av在线一区二区 | 亚洲国产精品人人爽夜夜爽 | av网站入口 | 黄色av一区二区 | 国产一区二区在线观看视频 | 精品午夜久久 | 免费av电影网站 | 黄色片网站 | 九九久久国产 | 日韩在线亚洲 | 久久美女视频 | 日韩免费一二三区 | 黄色片网站在线观看 | 日本啊v在线 | 二区三区在线观看 | 国产激情在线视频 | 国产精品免费一区 | 狠狠v欧美v日韩v亚洲ⅴ | 精品久久国产字幕高潮 | 欧美日韩一区二区三区在线 | 国产精品日韩在线观看 | 日本在线黄色 | 最新黄网 | 亚洲在线一区二区三区 | 亚洲一区二区三区精品动漫 | 美女搞黄网站 |