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 自动转换过去了