背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  
阅读内容

silverlight与javascript交互操作

[日期:2008-07-06] 来源:  作者: [字体: ]
 在silverlight开发中,我们可以使用js来调用silverlight中的方法(当然方法上要捆绑相应属性),也可以将指定的js方法绑定到silverlight应用中的事件上.本DEMO演示了通过js调用完成silverlight数据列表控件(DataGrid)的数
据绑定操作,并通过DataGrid的EmployeeList_BeginningCellEdit事件将当前选取的数据行信息返回到js所绑定的事件参数上,并调用该js方法显示选中数据行信息,如下图所示:
           
 
    下面介绍一下主要的开发过程:)
 
    首先,我们需要建立一个Silverlight Application ,名称为:Silverlight_JS_call.
 
    然后我们要在当前的项目中加入一个类文件,名称为:EmployeeInfo.cs.
    下面是相应的代码,相关内容见注释: 

[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; }
}
/// <summary>
/// 雇员事件参数(用于完成与js绑定事件参数)
/// </summary>
[ScriptableType]
public class EmployeeInfoEventArgs : EventArgs
{
    [ScriptableMember]
    public EmployeeInfo employeeInfo{ get; set; }
}

/// <summary>
/// 要注册并在页面中使用的js调用脚本对象
/// </summary>
[ScriptableType]
public class JavaScriptableObject
{
    /// <summary>
    /// js捆绑的事件handler
    /// </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);
    }
}

    上面代码中要注意的是[ScriptableType]和[ScriptableMember],前者允许Silverlight把类型暴露给脚本,后者
则会把成员方法或属性暴露给脚本.

  而下面的代码就是page.xaml中的内容:  

<UserControl xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  x:Class="Silverlight_JS_call.Page"
    xmlns="http://schemas.microsoft.com/client/2007"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="300" />
        </Grid.RowDefinitions>
        <my:DataGrid  x:Name="EmployeeList"  Grid.Row="1"  AutoGenerateColumns="True" Height="280" Margin="5,5,5,5" AlternatingRowBackground="AliceBlue" RowBackground="BlanchedAlmond">
        </my:DataGrid>
  </Grid>
</UserControl>

  下面则是相应的page.xaml.cs文件的内容(相关内容见注释):  
[ScriptableType]
public partial class Page : UserControl
{
    public Page()
    {
        InitializeComponent();
        this.Loaded += Page_Loaded;
        this.EmployeeList.BeginningCellEdit +=new EventHandler<DataGridCellEditingCancelEventArgs>(EmployeeList_BeginningCellEdit);
    }
   
   
    void Page_Loaded(object sender, RoutedEventArgs e)
    {
        javaScriptableObject = new JavaScriptableObject();
        //注册js可用的类型(详情见Silverlight_JS_callTestPage.aspx中的js代码)
        HtmlPage.RegisterScriptableObject("EmployeeObject", javaScriptableObject);
        HtmlPage.RegisterScriptableObject("Page", this);
    }
   
    /// <summary>
    /// 击编辑雇员列表信息事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void EmployeeList_BeginningCellEdit(object sender, DataGridCellEditingCancelEventArgs e)
    {
        //当有要编辑的信息时
        if (EmployeeList.SelectedItem != null)
        {
            EmployeeInfo employeeInfo = EmployeeList.SelectedItem as EmployeeInfo;
            //执行选中信息事件操作(最终会执行js所绑定的function代码)
            javaScriptableObject.OnSelectEmployeeInfo(employeeInfo);
        }
    }   

  //这里必须声明是public,否则js调用该方法时会报错
    [ScriptableMember]
    public void LoadData(int count)
    {
        //加载指定数据的雇员信息
        EmployeeList.ItemsSource = new EmployeeManager().GetEmployeeList(count);
    }

    JavaScriptableObject javaScriptableObject;     
}


    上面代码要注意的是RegisterScriptableObject方法的调用,它用来注册可被脚本使用的对象实例,
与它相对应的还有一个方法RegisterCreateableType,它用于注册可被脚本使用的类型.

  到这里,基本上完成的cs代码的开发工作.下面则是相应的js调用以及事件绑定代码了,请看:

<script type="text/javascript">
  //显示选取的雇员信息
  //注:args为cs中的EmployeeInfoEventArgs类型实例
  function ShowSelectEmployeeInfo(sender, args)
  { 
      $get("employeeNo").value = args.employeeInfo.EmployeeNo;
      $get("employeeName").value = args.employeeInfo.EmployeeName;
      $get("employeeAddress").value = args.employeeInfo.Address;
      $get("results").style.display = 'block';
  }
 
  //初始化操作,绑定到input元素("加载数据")的click事件上,详情参见aspx文件
  function Init(obj)
  {
      //绑定上面的js函数到silverlight的事件handler
      $get("Xaml1").content.EmployeeObject.SelectEmployeeInfo = ShowSelectEmployeeInfo;
     
      //加载雇员信息   
      $get("Xaml1").content.Page.LoadData(parseInt(obj.title));             
  }
</script>

         
    另外在进行初始化操作,这里使用了onclick方法来执行操作,而不是直接运行相应代码.原因是
silverlight对象加载是使用了异步方式,这样会造成对象实例化完成时间迟于页面JS脚本的运行时间.
这样设计的原因,我个人认为主要是UE方面的考虑.而这时如果脚本中直接调用对象实例化的属性或
方法时,会出现对象未知的情况.
     
    好了,今天的内容就到这里了.
  源码下载链接,请点击这里:)
阅读:
录入:dm

推荐 】 【 打印
相关新闻      
本文评论       全部评论
发表评论
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款


点评: 字数
姓名:
内容查询