Silverlight-Caliburn应用框架3
前一篇主要介绍了在Silverlight中配置Caliburn框架,现在就在这个基础上理解Caliburn的Action特性的使用,之前我们说Action特性使得Silverlight的绑定可以支持方法,这篇就从这个角度着手,实现UI可以绑定到方法。
这里所举得例子很简单,就是求一个数的开方值,这样使得我们的注意力更集中在框架本身
首先我们按照之前所讲的步骤配置好Caliburn,现在先看一看架构
现在我们先定义类Extraction:
public class Extraction{public double Extrace(double param){return Math.Sqrt(param);
}}
类里面定义了Extrace()用来返回一个数的开方值,
下面设计一下UI:
<TextBox Name="txtInput" /><TextBox Name="txtResult" /><dataInput:Label Name="label1" Content="输入:" /><dataInput:Label Name="label2" Content="结果:" /><Button Content="计算></Button>
这里注意我们的命名,因为后面会用到这两个文本框的Name,最后的效果大概是这样的:
这里我们用一个TextBox输入一个数,然后将结果显示在结果的文本框中,现在来对XAML进行操作,先添加相关的引用:
xmlns:local="clr-namespace:Actions"xmlns:ca="clr-namespace:Caliburn.PresentationFramework.Actions;assembly=Caliburn.PresentationFramework"xmlns:pf="clr-namespace:Caliburn.PresentationFramework;assembly=Caliburn.PresentationFramework"xmlns:ct="clr-namespace:Caliburn.PresentationFramework.Triggers;assembly=Caliburn.PresentationFramework"
上面我们引入了几个相关的类,在WPF中只有引用一个就可以了,Sl中缺少这种支持,所以需要单独引用每个类,那么这几个类稍后就会看到其用途,
现在我们需要在根元素中指定该Action的目标对象
<ca:Action.Target><local:Extraction /></ca:Action.Target>
现在关心的就是如何将Button与Extrace()关联,这里就是Caliburn所起到的作用了,我们将Button修改为:
<Button Content="计算" Height="23" HorizontalAlignment="Left" Margin="71,120,0,0" Name="button1" VerticalAlignment="Top" Width="75"><pf:Message.Triggers><pf:RoutedMessageTriggerCollection><ct:EventMessageTrigger EventName="Click"><ct:EventMessageTrigger.Message><ca:ActionMessage MethodName="Extrace" OutcomePath="txtResult.Text"><pf:Parameter ElementName="txtInput" Path="Text" /></ca:ActionMessage></ct:EventMessageTrigger.Message></ct:EventMessageTrigger></pf:RoutedMessageTriggerCollection></pf:Message.Triggers></Button>
上面的代码主要利用了Message.Triggers附加属性,通过这个属性我们可以给任何元素添加一系列的触发信息,这里我们关注一下EventMessageTrigger,
它可以触发一个事件发送消息给控制器。在上面的代码中,我们单击Button时,就会发送指明将要访问Extrace()的ActionMessage,在SL3版本之前,因为不支持直接绑定到参数,所以通过ElementName和Path属性达到这种效果,这里即通过元素txtInput的Text属性值作为参数传给Extrace(),而方法的返回值则绑定到txtResult.Text属性上。
触发器由谁来操作的?看到我们在根元素中声明的Action.Target了吗,我们在其中实例化了一个Extraction类,就是由其来处理ActionMessage的。
现在我们的程序事实上已经实现了求开方值的功能,不过对于上面Button中的Xaml标签似乎比较多,没关系,在Caliburn中为我们提供了一系列的简化方式,我们接下来一个一个的看:
<Button Content="计算" pf:Message.Attach="[Event Click] = [Action Extrace(txtInput.Text) : txtResult.Text]">
这是一种声明触发器或消息较好的方式,用的是Message.Attach附加属性,这个属性可以将一个字符串解析为触发器,在等号左边我们声明了触发器类型和参数,这里即为Click事件声明了EventMessageTrigger,等号右边即声明了消息的类型和内容,这里的解释与第一种方式是一样的,即声明一个参数来自于txtInput.Text,并且返回值绑定到txtResult.Text的ActionMessage,对于这里的“[]”是可以省略的。
如果有必要的话,也可以给参数指定绑定模式:
<Button Content="计算" pf:Message.Attach="Event Click = Action Extrace(txtInput.Text:TwoWay) : txtResult.Text" />现在看第二种方式:
<Button Content="计算" pf:Message.Attach="Extrace(txtInput.Text) : txtResult.Text" />
和第一种方式比,我们省略了触发器的类型,Caliburn会根据附加的对象的类型选择一个默认的触发器,这里默认的触发器是EventMessageTrigger,消息类型
为ActionMessage。如果方法没有返回值和参数的情况下,我们可以直接写成
<Button Content="计算" pf:Message.Attach="Extrace"/>如果有多个事件只要用;隔开即可,如
<Button pf:Message.Attach="[Event Click]=[Action Method1];[Event Loaded]=[Action Method2]" />
对于Action简写的几种形式,一般就用到这几种情况,可以参考这篇文章的总结,上面对于参数的传值,我们实际上使用了Extrace(Element.Property)
这种方式,实际上Caliburn支持多种参数传递方式,比如我们可以直接传一个值给其:Extrace('9');也可以传递一个字符串:Extrace('abcde');也可以
绑定到控件的默认属性上:Extrace(TextBox1);还有其它几种方式就不一一列举了,对于信息触发器,Caliburn提供了三种类型:EventMessageTrigger,
GestureMessageTrigger, AttachedEventMessageTrigger,它们在Caliburn.PresentationFramework.Triggers命名空间下,也可以自己
从BaseMessageTrigger类中扩展触发器类型,我们上面主要使用了EventMessageTrigger,关于其它两种的使用以及参数的传递方式都可以从文档中查看
代码下载:ActionInCaliburn 环境:VS2010+SL3