silverlight与js交互以及复杂对象传输 用于记录

silverlight与js要交互需要先将silverlight 方法暴漏出来

1、首先在app.xaml 配置文件中的Application_Startup 方法内添加暴漏出来的 类:

 var dict = e.InitParams;    //这里是初始化参数信息  是Dictionary 键值对的形式表现   可以用接口接收
            this.RootVisual = new MainPage(dict);            
            HtmlPage.RegisterScriptableObject("JsLatest",this.RootVisual);//这里给MainPage类起了一个对外的名称叫JsLatest   外部可以使用这个名称调用到这个类

2、在需要暴漏的方法添加标签

 [ScriptableMember]

        public void InitA(string a= "0", string b= "0", string c= "0", string d= "0", string e= "0", string f)

这里初始化了一个方法InitA  里面的参数6个  当没有传递参数的时候有默认值

是不是传递的参数太多了????

3、调用方法:

 <object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
                height="100%" width="100%">
                <param name="source" value=".***路径" />
                <param name="onError" value="onSilverlightError" />
                <param name="background" value="white" />
                <param name="minRuntimeVersion" value="4.0.50826.0" />
                <param name="autoUpgrade" value="true" />
                <param name="background" value="transparent" />
                <param name="windowless" value="true" />
                <param name="InitParams" value="target=t" />   //前面初始化传递的参数  target   为t
                <param name="onLoad" value="pluginLoaded" /> //加载silverlight后加载的的方法   pluginLoaded 方法 

                <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration: none">
                    <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="获取 Microsoft Silverlight"
                        style="border-style: none" /></a>
            </object>

   所以你需要在加载前添加一个方法pluginloaded  我的方法如下:

var slCtl = null;
        function pluginLoaded(sender, args) {
            slCtl = sender.getHost();
        }

//这里获取到slctl就是silverlight本身  

 调用silverlight 内刚才自己的写的类的方法
        function CallSilverlight() {
            slCtl.Content.JsLatest.InitA(lineAirTeGO, lineAirHiGO, lineEarthTeGO, lineEarthHiGO, linePHGO);
        }

//使用.content 可以获取所有开放的类    通过前面注册的名称 JsLatest  然后方法InitA 传递参数  是不是soeasy   但是传的参数那么多是不是不很不友好 那么看下面:


那么用下面的方法:

注册方法时候将参数不指定具体类型 使用ScriptObject

 [ScriptableMember]
        public void InitInfo(ScriptObject obj)

//解释下  ScriptObject  表示一个JS 对象   任意对象 可以是数组  列表 等等

我定义一个复杂对象:

  var slvDataList = {
            Order_f: 0,
            CreateNew: function (Order_i, Title, CurrentData, MaxData, MinData, MaxRange, MinRange, Unit, ThemeSet) {
                var obj = {};
                obj.Order_i = Order_i;
                obj.Title = Title;
                obj.CurrentData = CurrentData;
                obj.MaxData = MaxData;
                obj.MinData = MinData;
                obj.MinRange = MinRange;
                obj.MaxRange = MaxRange;
                obj.Unit = Unit;
                obj.ThemeSet = ThemeSet;
                return obj;
            }
        }

 var ObjectCollection = [];

  var s_obj = slvDataList.CreateNew(0, "1个", "1" , "40", "-20", "100", "-20", "℃", "0");
                    ObjectCollection.push(s_obj);
                    s_obj = slvDataList.CreateNew(1, "2个", "2" , "40", "-20", "100", "0", "%", "1");
                    ObjectCollection.push(s_obj);
                    s_obj = slvDataList.CreateNew(2, "3个", "3", "40", "-20", "100", "0", "ppm", "2");
                    ObjectCollection.push(s_obj);
                    s_obj = slvDataList.CreateNew(3, "4个", "4", "40", "-20", "100", "0", "ppm", "3");
                    ObjectCollection.push(s_obj);

是不是很复杂的样子  然后我调用方法:

slCtl.Content.LoadLatest.InitInfo(ObjectCollection);

接收到对象怎么弄?看我怎么处理

在c#里面定义一个同js相同结构的类 类名称不一定一样  但是参数名称一样要一样  类型也一定要一样 否则会报错  NPIOobject  你懂得

 public class TDatat
    {
        //显示名称   数值  最大值  最小值   量程最小 量程最大  显示的数据KEy  p_no 是顺序
        public string Title { get; set; }
        public string CurrentData { get; set; }
        public string MaxData { get; set; }
        public string MinData { get; set; }
        public string MinRange { get; set; }
        public string MaxRange { get; set; }
        public int Order_i { get; set; }
        public string Unit { get; set; }
        public string ThemeSet { get; set; }
    }

 [ScriptableMember]
        public void InitDataInfo(ScriptObject obj)
        {         
            var objlist = obj.ConvertTo<List<TDatat>>();     

转换为LIST 了 看着处理吧是不是很easy  自动转换过去了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值