因为Silverlight可以访问HTML中的DOM元素以及调用HTML页面中的JS方法,并且可以将自身的方法“暴露”给HTML页面中的JS方法(通过ScriptableMember]),所以我们可以利用这一特点来实现两个Silverlight应用程序之间的数据通信。为了直观起见,本人做了这个DEMO,希望能够对大家在理解上有所帮助。
     本DEMO的工作流程如下:     
     
     Silverlight 1 调用HTML中的JS方法,而该方法会去调用Silverlight 2中“暴露”的方法来显示选中的数据。  
     请大家先看一下这个DEMO的运行效果,如下图所示:
     
     
  
     在上图中分别有两个Silverlight应用,一个是雇员列表,一个是详细信息。其中的雇员列表是我以前在园子里发表过的一遍文章中提到的DEMO,这里只是为了便于演示而简单的加以改造,其雇员类信息如下:
 
[ScriptableType]
public class EmployeeInfo
{
    /// <summary>
    /// 雇员编号
    /// </summary>
    [ScriptableMember]
    public int EmployeeNo { get; set; }
    /// <summary>
    /// 雇员名称
    /// </summary>
    [ScriptableMember]
    public string EmployeeName { get; set; }
    /// <summary>
    /// 地址
    /// </summary>
    [ScriptableMember]
    public string Address { get; set; }
}

    上面的ScriptableType,ScriptableMember属性绑写是为了让html中的脚本代码可以访问(即可见)。
    
    而下面的代码则是为了定义一个“脚本对象类”及其事件处理(包括参数)。    
/// <summary>
/// 雇员事件参数(用于完成与js绑定事件参数)
/// </summary>
[ScriptableType]
public class EmployeeInfoEventArgs : EventArgs
{
    [ScriptableMember]
    public EmployeeInfo employeeInfo { get; set; }
}

/// <summary>
/// 要注册并在页面中使用的js调用脚本对象
/// </summary>
[ScriptableType]
public class JavaScriptableObject
{
    /// <summary>
    /// js捆绑的事件处理器
    /// </summary>
    [ScriptableMember]
    public event EventHandler<EmployeeInfoEventArgs> SelectEmployeeInfo;

public void OnSelectEmployeeInfo(EmployeeInfo employeeinfo)
    {
        if (SelectEmployeeInfo != null)
        {
            SelectEmployeeInfo(this, new EmployeeInfoEventArgs()
            {
                employeeInfo = employeeinfo
            });
        }
    }
}

接着就是一个雇员数据操作类,主要用于获取雇员信息,如下:
/// <summary>
/// 雇员信息管理类
/// </summary>
public class EmployeeManager
{
    public IEnumerable<EmployeeInfo> employeeList;
    /// <summary>
    /// 初始化会员数据
    /// </summary>
    public EmployeeManager()
    {
        //初始化雇员数据
        employeeList = new List<EmployeeInfo>()
        {
            new EmployeeInfo(){EmployeeNo = 10001, EmployeeName = "张三" , Address = "北京"},
            new EmployeeInfo(){EmployeeNo = 10002, EmployeeName = "李四" , Address = "北京"},
            new EmployeeInfo(){EmployeeNo = 10003, EmployeeName = "王五" , Address = "北京"},
            new EmployeeInfo(){EmployeeNo = 10004, EmployeeName = "马六" , Address = "北京"},
            new EmployeeInfo(){EmployeeNo = 10005, EmployeeName = "王大麻子" , Address = "北京"},
            new EmployeeInfo(){EmployeeNo = 10006, EmployeeName = "王宝强" , Address = "北京"},
            new EmployeeInfo(){EmployeeNo = 10007, EmployeeName = "王蛋蛋" , Address = "北京"},
            new EmployeeInfo(){EmployeeNo = 10008, EmployeeName = "王五强" , Address = "北京"}
        };
    }

/// <summary>
    /// 获取指定数量的雇员数据
    /// </summary>
    /// <param name="count">要获取的雇员信息数</param>
    /// <returns></returns>    
    public IEnumerable<EmployeeInfo> GetEmployeeList(int count)
    {
        return (from e in employeeList
                select new EmployeeInfo
                {
                    EmployeeNo = e.EmployeeNo,
                    EmployeeName = e.EmployeeName,
                    Address = e.Address

}).Take(count);
    }

}


    有了数据和数据结构,我们可以在应用程序中给列表控件绑定数据源了,如下:
    
//这里必须声明是public,否则js调用该方法时会报错
[ScriptableMember]
public void LoadData(int count)
{
    //加载指定数据的雇员信息
    EmployeeList.ItemsSource = new EmployeeManager().GetEmployeeList(count);
}

    
    当然DEMO中所提供的功能里有“选取某一行雇员信息”的操作,其实现方法如下:
 
/// <summary>
/// 单击编辑雇员列表信息事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void EmployeeList_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    //当有要编辑的信息时
    if (EmployeeList.SelectedItem != null)
    {
        EmployeeInfo employeeInfo = EmployeeList.SelectedItem as EmployeeInfo;
        //执行选中信息事件操作(最终会执行js所绑定的function代码)
        javaScriptableObject.OnSelectEmployeeInfo(employeeInfo);
    }
}
     大家请注意上面的这一行代码:
javaScriptableObject.OnSelectEmployeeInfo(employeeInfo);

     其完成的就是对HTML页面上JS绑定事件的调用,其JS绑写事件代码如下:
//初始化操作
function Init(obj) {
    //绑定js函数到silverlight的事件处理器
    $get("Xaml1").content.EmployeeObject.SelectEmployeeInfo = ShowSelectEmployeeInfo;
    
}

     当然,上面还有一个内容没有说明,即EmployeeObject对象是从哪来的,其实它就是我们公布到HTML中让 JS可以访问的对象JavaScriptableObject的实例,如下:      
JavaScriptableObject javaScriptableObject;
void Page_Loaded(object sender, RoutedEventArgs e)
{
    javaScriptableObject = new JavaScriptableObject();
    //注册js可用的类型(详情见Silverlight_JS_callTestPage.aspx中的js代码)
    HtmlPage.RegisterScriptableObject("EmployeeObject", javaScriptableObject);
    ..
}

                
     而JS方法"ShowSelectEmployeeInfo"即是实现对Silverlight 2应用中“暴露”方法的调用。其内容如下:     
//显示选取的雇员信息
function ShowSelectEmployeeInfo(sender, args) {
    $get("Xaml2").content.Page.LoadDetailData(parseInt(args.employeeInfo.EmployeeNo),
                                              args.employeeInfo.EmployeeName,
                                              args.employeeInfo.Address);
}

    而Silverlight 2应用中的LoadDetailData方法所实现的就是将选中的单个雇员信息进行显示,如下:     
//这里必须声明是public,否则js调用该方法时会报错
[ScriptableMember]
public void LoadDetailData(int employeeNo, string employeeName, string address)
{
    //加载指定数据的雇员信息
    EmployeeNo.Text = employeeNo.ToString();
    EmployeeName.Text = employeeName;
    Address.Text = address;
}

    到这里,基本上DEMO中的主要内容就介绍完了。
    
    下面再给大家演示一个Silverlight与FLASH进行数据通信 的例子,其实现的功能如下:    
 
    在Silverlight应用中拖动一张图片,在右侧的FLASH区域中相应的FLASH对象跟着被“移动”,其效果如下
图所示:
 
 
 
   
其实这个DEMO最初的原型出自微软件的黄继佳,我是在一次SILVERLIGHT培训中看到他这个演示,当时我想实现原理应该与本文所提到的大同小异,后来被证实现确实如此。当然他的演示中实现的JS代码很简单,完全就是用纯JS来实现即可。我这里并未完全使用了他的模型代码。因为上面所说的是在CS代码中进行事件的
绑定及其相关操作,所以我还是照上面所提供的思路重新写了这个DEMO,实现的效果与黄纪佳的原型基本相似。因为篇幅起见,这里就不多做赘述了,大家下载代码后一看便知(SLImage.xaml.cs和SLtoFlash.htm文件)。
本文转自 daizhenjun 51CTO博客,原文链接:http://blog.51cto.com/daizhj/124340,如需转载请自行联系原作者

在两个Silverlight应用间数据通信(包括与Flash通信)相关推荐

  1. 如何在基于 Silverlight 的本地应用程序之间实现通信

    http://msdn.microsoft.com/zh-cn/library/dd833075(VS.95).aspx 在两个Silverlight应用间数据通信(包括与Flash通信) 如何在基于 ...

  2. 1.7、基于BGP实现两个AS系统间通信

    资源:基于BGP实现两个AS系统间通信 目录 1.自治系统(AS) 2.BGP 2.1 BGP定义 2.2 BGP发言人 2.3 BGP对等体 2.4 BGP基本配置 3.路由过滤 3.1 建立过滤规 ...

  3. 如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录

    如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录 目录

  4. 解决:Word需要查找两个固定字符间的字符 Word将查找到的字符全部选中

    问题描述: 1.Word需要查找两个固定字符间的字符.例如:[1].[tttttt].[nice and well]等. 2.将查找到的字符全部选中,然后复制. 解决方案: 问题1解决方案: 在Wor ...

  5. LISP道路中线_如何画两条样条线间中心线之三:CAD插件/Lisp编程法

    前面有介绍过两种CAD画两条样条线的中心线的方法,分别是用三维曲面提取中心线和画辅助取中心线,这两种方法.其实还有更简单的方法,就是用插件,感兴趣的可以自己找有相关功能的插件来使用. 这里提供一个. ...

  6. vs2010 学习Silverlight学习笔记(11):数据与通信之WebClient

    概要: 基础知识终于学完了,我今天又从第一篇看到第十篇,发现明白了一些东西,还有忘记了部分东西.呵呵,咱不能猴子掰玉米,学了新的忘记旧的.要经常去复习,去用.这一篇是数据通信部分的第一篇,有些东西没接 ...

  7. fx5u怎么与计算机通讯,两个FX5U系列PLC如何用RS485进行通信幻灯片

    <两个FX5U系列PLC如何用RS485进行通信幻灯片>由会员分享,可在线阅读,更多相关<两个FX5U系列PLC如何用RS485进行通信幻灯片(17页珍藏版)>请在人人文库网上 ...

  8. 在企业中使用的Silverlight:RAD数据通信用户友好的数据库访问

    最近在学习Silverlight,在网上搜了一把Silverlight开源项目,结果很少,顶多就是银光网上有那么点资料,EasySL开源框架也是不错的. 于是打开CodeProject上面浏览看到了相 ...

  9. html GPS坐标实现,JavaScript 实现GPS坐标点距离计算(两个经/纬度间的距离计算)...

    在LBS(基于位置服务)的一些应用中,有时我们会需要计算两个用户或两个坐标点之间的距离.要解决这类问题,就要了解空间几何的概念并结合数学中在三角函数公式计算两点之间的值.本文介绍基于经度/纬度的,两个 ...

最新文章

  1. 各种优化算法公式快速回忆优化器-深度学习
  2. matlab实现移动平均
  3. SLAM闭合回环————视觉词典BOW小结
  4. 实现俄罗斯方块遇到的问题及游戏下载
  5. python之模块csv之CSV文件一次写入多行
  6. 【资源】MIT 更新最大自然灾害图像数据集,囊括 19 种灾害事件
  7. java学习(151):字节输出流
  8. java 简易的闹钟设计_JavaFX实现简易时钟效果
  9. webpack 编译完成执行代码
  10. 不服不行!java编程思想第六版下载
  11. Oracle创建表的语法
  12. mid、mif文件操作工具类
  13. PDFObject的使用(转)
  14. ps中100%比例放大图片显示的快捷键
  15. Axure使用教程(二)、动态面板
  16. 熊猫之死,是腾讯对360的又一次胜利
  17. React Native入门-实战解析(上)
  18. 虚拟机连不上网问题详解
  19. python模拟登录钉钉,Python—实现钉钉后台开发
  20. 云服务器上安装 R语言 以及 RStudio Server 详细图文操作(全)

热门文章

  1. 区块链JAVA数字交易所官方商业版开发级全套三端纯源码
  2. HTML5汽车轮毂改装网站模板
  3. Visual Composer 最好的扩展 wordpress插件
  4. 仿星球大战个人引导页源码
  5. php 分页类视频,php分页类_你不可错过的一个php分页类
  6. 征途手游2新开区服务器维护多久,《征途2手游》开启新服“星火燎原”
  7. 阿里云学生轻量级应用服务器安装MySQL
  8. 做一个项目,平时都用到哪些工具提高效率(下)
  9. ACE editor 在线代码编辑极其高亮
  10. 站长如何屏蔽流氓宽带商在你的页面里面强行插入的广告代码