zoukankan      html  css  js  c++  java
  • SilverlightCaliburn应用框架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

  • 相关阅读:
    小程序源码丢失了怎么在微信平台反编译找回
    做前端技术方案选型的时候,你是怎么做决策的?
    小程序源码丢失了怎么在微信平台反编译找回
    关于form.submit()不能提交表单的错误原因
    IE 8兼容:X-UA-Compatible的解释
    常用的CSS Hack技术集锦
    PHP制作验证码
    利用原生JavaScript获取样式的方式小结
    利用Javascript获取当前日期的农历日期
    教你利用iframe在网页中显示天气
  • 原文地址:https://www.cnblogs.com/626498301/p/1807825.html
Copyright © 2011-2022 走看看