zoukankan      html  css  js  c++  java
  • silverlight 中javascript 代码与托管代码的互调用 以及一些思考

          silverlight 客户端javascript 代码与托管代码的互调用时比较用意义的同时,因为silverlight本身就是一个插件,如果两者之间不能进行相互的调用,对于web 上的一些特殊的功能是没法操作的。

      以下为两者之间进行互操作的实现代码,以及最后一些在实际开发中的可以使用的地方。

    1, javascript 调用托管代码 。

    这个就比较有意思了,

    /// <summary>
    /// 注册的客户端可调用的托管代码
    /// </summary>
    [ScriptableType()]
    public class CallClass
    {
    [ScriptableMember()]
    public int Cal(int x, int y)
    {
    int z = x + y;
    return z;
    }
    }

    以上是我们需要客户端进行调用的托管代码,注意添加的属性ScriptableType 和ScriptableMember 之后就是进行托管代码的注册客户端可访问。

    private void Application_Startup(object sender, StartupEventArgs e)
    {
    MainPage main = new MainPage();
    CallClass cla = new CallClass();
    HtmlPage.RegisterScriptableObject("SilverlightApplicationExample", cla);/// 注册方法
    this.RootVisual = main;
    }

    主要是在应用程序启动是进行客户端可调用方法的注册。

    客户端进行javascript的调用有几点需要注意:

    <body>
    <div id="demo" style="100%;height:30px;background-color:cadetblue;text-align:center">

    <button id="Click" style="align-items:center;align-content:center" onclick="CallCode(3,100)" >调用</button>
    </div>
    <form id="form1" runat="server" style="height:29px;300px;">
    <div id="silverlightControlHost">
    <object id="silverlight" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
    <param name="source" value="ClientBin/javascriptDemo.xap"/>
    <param name="onError" value="onSilverlightError" />
    <param name="background" value="white" />
    <param name="onLoad" value="pluginLoaded"/>
    <param name="minRuntimeVersion" value="5.0.61118.0" />
    <param name="autoUpgrade" value="true" />
    <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=5.0.61118.0" style="text-decoration:none">
    <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="获取 Microsoft Silverlight" style="border-style:none"/>
    </a>
    </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;0px;border:0px"></iframe></div>
    </form>
    </body>

    以上为silverlight宿主客户端页面的界面 注意<param name="onLoad" value="pluginLoaded"/> 这个很有必要 ,通过这个我们可以获取silverlight 对象

    <script type="text/javascript">
    var slCtl = null;
    function pluginLoaded(sender) {
    slCtl = sender.getHost(); /// 获取silverlight 插件
    alert(slCtl);
    }
    function Add(a,b)
    {
    return a + b;
    }
    function CallCode(a,b)
    {
    var result = slCtl.Content.SilverlightApplicationExample.Cal(a, b);
    alert(result);

    }

    </script>

    这个客户端的javascript代码。

    pluginLoaded方法就是我们获取silverlight对象的。CallCode 方法就是进行托管代码调用的测试方法。另外一个Add 方式是托管代码调用javascript的方法,在此贴上,下面会用到。

     界面如下:

    2, 托管代码调用javascript。

    javascript的方式是上边的Add

     按钮call 的click代码如下:

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
    //获取当前的HtmlWindows对象
    HtmlWindow win = HtmlPage.Window;
    // 获取客户端的javascript方法
    ScriptObject sObj = win.GetProperty("Add") as ScriptObject;
    // 执行方法
    var result= sObj.InvokeSelf(4,33333);

    MessageBox.Show(result.ToString());
    }

    以上就是互调用的方法。

    3,一点思考。

    记得有很长一段时间了,以为同学问我silverlight如何进行客户端串口通信,我以前是做过一些关于串口通信的系统,有桌面的也有web 的,对于silverlight是做过系统,但没有使用串口的,经过测试silverlight没有直接进行串口的API ,这就不太方便了,silverlight可以设计如此漂亮的界面,但是对于做串口数据的朋友就有点不太好了,一般我们的做法是使用Activex 插件进行本地串口数据的接受,并进行web 服务器端的处理,javascript可以方便的操作activex插件,但是silverlight就不行了,如果将两者结合起来不就可以解决了吗,当时是提出这样的技术方案,不知这位同学测实践过没有,现在写这篇博文主要是记录一下解决的方案,以及技术的总结。

  • 相关阅读:
    前端UI框架
    Knowledge
    Microsoft SQL Server
    ASP.NET MVC
    将博客搬至CSDN
    python中的数据类型
    python基础知识
    接口和抽象类的区别
    面向对象的四大特征
    数据结构学习笔记
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/3478599.html
Copyright © 2011-2022 走看看