Silverlight-Caliburn应用框架3

         Silverlight-Caliburn应用框架1

         Silverlight-Caliburn应用框架2

         Silverlight-Caliburn应用框架3

         Silverlight-Caliburn应用框架4 

         Silverlight-Caliburn应用框架5

         Silverlight-Caliburn应用框架6

     前一篇主要介绍了在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

posted @ 2010-08-25 09:35  ringgo  阅读(2488)  评论(6编辑  收藏  举报