您的位置:首页 > Web前端 > JavaScript

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

2015-06-18 11:01 337 查看
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 但是传的参数那么多是不是不很不友好 那么看下面:

那么用下面的方法:

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

[/b]

[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 自动转换过去了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: