前言:
我們知道WPF也有Command,比如內建的複製、粘貼、剪下、撤銷等。這裡要說的是Caliburn中的Command,
它們有什麼區別和不同點呢?
1、命令源
我們首先建立一個ShowMessageCommand.cs類,和ShowTitleMessageCommand.cs類。
分別寫上相應的命令方法。
[Command] public class ShowMessageCommand { [Preview("CanExecute")] public void Execute(string message) { MessageBox.Show(message); } public bool CanExecute(string message) { return !string.IsNullOrWhiteSpace(message); } }
這裡的[Command] 不加也能執行,但命令方法名必須是Execute。如果是其他方法名,則報錯。
ShowTitleMessageCommand.cs代碼
代碼 [Preview("CanExecute")] public void Execute(string title,string message) { MessageBox.Show(message,title); } public bool CanExecute(string title,string message) { return !string.IsNullOrEmpty(title); }
2、容器
我們在App.xaml.cs中的代碼不能和上次一樣了。這裡需要建立一個容器,並且把命令注入容器。
var container = new SimpleContainer(); CaliburnFramework.ConfigureCore(container).WithPresentationFramework().Start(); container.RegisterSingleton<ShowMessageCommand>("ShowMessage");
這裡的ShowMessageCommand是一個類檔案,就是剛才的命令源。
我們把命令源注入了容器,並且"ShowMessage"命令的名稱。
xaml頁面:
<Button Content="Click Show Message" cal:Message.Attach="ContainerCommand ShowMessage(message.Text)"/>
這裡ContainerCommand 是通過注入容器的命令。ShowMessage不用說了吧。
也可以更詳細的寫這個命令。
代碼<Button Content="Trigger Click Show Message"> <cal:Message.Triggers> <cal:RoutedMessageTriggerCollection> <cal:EventMessageTrigger EventName="Click"> <cal:EventMessageTrigger.Message> <cal:CommandMessage Command="{cal:Resolve Key=ShowMessage}"> <cal:Parameter Value="{Binding ElementName=message, Path=Text}"/> </cal:CommandMessage> </cal:EventMessageTrigger.Message> </cal:EventMessageTrigger> </cal:RoutedMessageTriggerCollection> </cal:Message.Triggers> </Button>
3、資源
剛才的命令是通過注入容器來實現的,還有一種方法是通過資源命令(ResourceCommand)
我們這裡用Window.Resource來引用它。
<Window.Resources> <local:ShowTitleMessageCommand x:Key="showCommand"/></Window.Resources>然後 Button部分:
<Button Content="Click Show Title Message" cal:Message.Attach="ResourceCommand showCommand(title.Text,message.Text)"/>
這裡的showCommand就是資源中的key。
華麗的分隔線——————————————————————————————————————————
代碼未解決:
在Caliburn上其實還有一種BoundCommand。