`
jiasongmao
  • 浏览: 666943 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

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

阅读更多

声明:该博文转载自:http://daizhj.blog.51cto.com/285189/124340

 

因为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文件)。
 
作者:代震军,daizhj

 

 

 
分享到:
评论

相关推荐

    Silverlight与数据库交互示例

    它不仅能够提供与Flash相媲美的动画和图形效果,还支持更高级别的数据绑定、XAML(可扩展应用程序标记语言)以及.NET Framework的强大功能。本文将详细介绍如何使用Silverlight结合.NET 3.5技术创建一个数据驱动的...

    silverlight 将DataGrid数据导出EXCEL

    综上所述,将Silverlight中的DataGrid数据导出到Excel涉及了前端展示、数据绑定、客户端与服务器端通信、文件格式转换等多个环节。开发者需要对这些技术有深入理解,才能实现流畅且功能完备的数据导出功能。

    Silverlight 2教程中文版

    创建项目后,Visual Studio会自动生成包含一个Silverlight客户端应用和一个ASP.NET Web服务器端应用的解决方案。默认情况下,项目包含Page.xaml和App.xaml文件,分别表示UI页面和应用程序全局设置。XAML语言用于描述...

    微软Silverlight开发团队零距离接触系列课程(2):用Silverlight快速构建网络应用

    2. **开发环境设置**:熟悉Visual Studio集成开发环境(IDE)和Expression Blend,这两个工具是Silverlight开发的主要工具。学习如何安装和配置这些工具,以便开始编写代码。 3. **XAML语言**:XAML是Silverlight中...

    WPF和Silverlight项目设计实例光盘源代码10

    当与Silverlight结合时,WCF RIA Services简化了客户端和服务器之间的数据交互,使得在Silverlight应用中调用服务端业务逻辑变得容易。开发者可以利用此实例学习如何创建和管理服务,以及如何在客户端进行数据验证和...

    WPF、SilverLight、XAML新技术文档

    - **Silverlight项目结构**:一个典型的Silverlight应用程序包含客户端和服务器两部分,客户端代码运行在浏览器中的Silverlight插件中,服务器端代码则处理数据和通信。 - **媒体播放与交互**:Silverlight支持媒体...

    Asp.net AJAX 与 Silverlight 实战手册( 源码)

    5. **数据绑定**:通过数据绑定,Silverlight可以将UI元素与后台数据源关联,实现动态更新。 6. **RIA(Rich Internet Applications)**:Silverlight旨在创建跨越浏览器的富客户端应用程序,提供桌面应用级别的...

    silverlight wcf 跨域访问 内含WORD图解和跨域文件

    通过正确配置这两个文件,并将其放在服务的根目录下,Silverlight应用就可以安全地与不同域的WCF服务进行通信了。同时,开发人员应确保在实际环境中适当限制访问权限,避免安全风险。 总的来说,这份资料包提供了...

    Hello SilverLight & SilverLight Step By Step

    3. 第一个SilverLight应用:通过创建一个简单的"Hello, World"项目,让读者熟悉XAML语言和编程模型。 4. UI设计:讲解如何使用XAML构建用户界面,包括控件、布局管理器和样式。 5. 数据绑定和数据源:介绍如何将数据...

    HTML 5 or Silverlight?

    - **通信**:WebSocket 协议的引入使得浏览器与服务器之间实现了全双工通信,为实时应用提供了技术支持。 #### Silverlight:Windows 平台的明星 尽管 HTML5 的势头迅猛,但 Silverlight 在 Windows 平台上的表现...

    Silverlight 小网站

    Silverlight,作为一个已经不再更新的技术,曾经是.NET Framework的一部分,主要用于创建丰富的互联网应用程序,提供了类似Adobe Flash的功能,但在交互性和多媒体内容展示上具有更强大的功能。 在开发Silverlight...

    WPF、SilverLight、XAML新技术文档(初学者学习资料)

    随着版本的发展,Silverlight的功能逐渐增强,包括数据绑定、图形渲染和网络通信等。 **XAML(Extensible Application Markup Language)**是XML的一个方言,主要用于描述WPF和Silverlight的用户界面。XAML通过简单...

    silverlight 银光志 实例

    Silverlight是由微软公司推出的,用于创建和展示丰富的交互式用户界面的框架,它在Web应用程序、多媒体播放和数据可视化等方面表现卓越。下面我们将围绕Silverlight实例,深入探讨其核心知识点。 1. **基础概念**:...

    Pro Silverlight 4 in C#

    - **silverlight4 C#**:这两个标签分别指代了本书的核心技术领域:Silverlight 4和C#语言。通过这些标签可以明确了解到本书的主要内容和目标读者群体。 #### 内容部分解析: - **THE EXPERT’S VOICE® IN ...

    Silverlight 2 教程+实例

    - **silverlight教程+实例.rar** 和 **silverlight 2实例.rar**:这两个文件同样提供了教程和实例,可能是不同来源的资料,帮助学习者深入理解和实践Silverlight 2开发。 **四、学习路径** 1. **基础知识**:首先...

    silverlight音乐播放器

    《Silverlight音乐播放器详解及应用》 ...SLMusicPlayer和SLMusicPlayer.Web两个文件可能是该播放器的源代码和Web部署部分,通过研究这些文件,我们可以进一步了解和定制自己的Silverlight音乐播放器。

    Silverlight & WCF 安装出现问题

    Silverlight和WCF是Microsoft开发的两种技术,用于构建丰富的客户端应用程序和实现服务间的通信。在本文中,我们将深入探讨这两个技术以及它们在安装和使用过程中可能出现的问题。 首先,Silverlight是一种基于.NET...

    SL两个页面消息传递的实现

    SL,即Silverlight,是微软开发的一个Web应用程序框架,用于创建和部署丰富的、交互式的多媒体内容,它在浏览器中运行,类似于Adobe Flash。本话题主要关注如何在Silverlight中的两个不同页面之间实现消息传递。 在...

    [其他类别]Silverlight 2.0 功能展示Demo源码_silverlightzs(ASP.NET源码).rar

    Silverlight是微软推出的一种富互联网应用程序(RIA)平台,主要用于构建和播放高质量、交互式的媒体和图形内容,与Adobe Flash相竞争。 【描述】中提到的“ASP.NET源码”表明这个Demo项目不仅使用了Silverlight,...

Global site tag (gtag.js) - Google Analytics