在JavaScript中调用托管代码

时间:2007-11-05 12:01:18   来源:silverlight.cn  作者:  点击:次  出处:技术无忧

介绍
本篇QuickStart将演示在基于Silverlight的应用程序中怎么样来直接使用JavaScript来访问托管代码中的事件, 属性, 和方法等.这个特性使得客户端的scripts访问.NET Framework的托管代码的扩展库特性成为可能,而不需要回传到服务器.

运行 查看 想要在基于Silverlight的应用程序中做到以上的功能,你需要准备以下步骤:

Handling XAML文件中的根 CanvasLoaded 事件.

注册然后以可脚本化的对象方式来访问类.

将类中可以用脚本方式来访问的成员标上[Scriptable] 标记.

从JavaScript中Handling 托管代码事件 .

从JavaScript中调用托管代码类的方法.

从JavaScript中访问托管代码类的属性 .

要求 (available from the Silverlight download site):

Microsoft Silverlight 1.1 Alpha.

Microsoft Visual Studio Code Name "Orcas" Beta 1.

Microsoft Silverlight Tools Alpha for Visual Studio Code Name "Orcas" Beta 1.

A Silverlight project. For instructions, see How to: Create a Silverlight Project.

从Silverlight Canvas中来handle XAML 事件
处理XAML 的Canvas 中的Loaded 事件,以此来建立Web page和托管代码类之间的联系. 在 XAML文件的Loaded 属性里, 请给该方法指定好名称以便于进行事件处理. 在接下来的示例中, Loaded 属性被赋值为OnLoaded, 这和第二步中处理XAML事件的方法是相关联的.

cs <Canvas
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Samples.Silverlight.CS.BasicCanvas;assembly=HtmlDOM1.dll"
x:Name="rootCanvas"
Height="500"
Width="500"
Loaded="OnLoaded"
Background="Red"
>
</Canvas>


VB

<Canvas x:Name="parentCanvas"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="OnLoaded"
x:Class="HtmlDOM1.BasicCanvas;assembly=ClientBin/HtmlDOM1.dll"
Width="640"
Height="480"
Background="White"
>
</Canvas>


在托管代码这边添加一个方法,它和第一步中定义的 XAML文件中的命名一样. 这个方法可以处理几乎所有初始化的任务, 创建和注册各种对象,关联事件等等. 在本篇中的代码示例中, Onloaded 方法处理XAML Canvas的 Loaded 事件 .

进行注册然后以可脚本化的对象方式来访问类
在处理初始化任务的方法中,比如像在QuickStart example的类中的Onloaded方法 ,使用RegisterScriptableObject() 方法来注册使这个类使其成为可脚本化的对象 .

cs

//Register the scriptable endpoints
WebApplication.Current.RegisterScriptableObject("basic", this);


VB

'Register the scriptable endpoints
WebApplication.Current.RegisterScriptableObject("basic", Me)


在JavaScript里,得到 Silverlight control的托管代码的宿主的引用.

cs

var control = document.getElementById("agControl1");


VB

var control = document.getElementById("SilverlightControl");


创建你在第一步中注册的类的引用,使用你在第一步中添加到注册方法中的名称参数. 在这个代码示例中,这个托管类在第一步中被注册为basic .接下来的JavaScript 代码演示如何使用第二步中创建的control reference来访问已经注册的类中的可脚本化的成员. 这段代码创建了一个 JavaScript 方法来处理类中的自定义事件.

注意
注意代码中的Content accessor(内容访问器),它表示了你得到了XAML文件的可编程的访问.

cs

control.Content.basic.AgeUpdatedEvent = firedFromScriptableEvent;


VB

control.Content.basic.AgeUpdatedEvent = firedFromScriptableEvent;


将类中可以得到访问的成员标记上 [Scriptable] tag
添加[Scriptable] metadata tag 到托管类中的成员上,以申明此类在JavaScript中是可以调用的.

cs

[Scriptable]
public class ScriptingCanvas : Canvas


VB

<Scriptable()> _
Partial Public Class ScriptingCanvas
Inherits Canvas


添加 [Scriptable] tags到类的任何成员,包括类属性,方法,事件等等你希望可以用JavaScript来调用的.下面的示例的类中的一个自定义事件和一个属性都被标记好了.

cs


[Scriptable]
public class CustomEventArgs : EventArgs
{
private int age;
private string name;
public CustomEventArgs(string iname, int iage)
{
age = iage;
name = iname;
}
[Scriptable]
public string Name
{
get { return name; }
set { name = value; }
}
[Scriptable]
public int Age
{
get { return age; }
set { age = value; }
}
}

VB

<Scriptable()> _
Public Class CustomEventArgs
Inherits EventArgs
Private _age As Integer
Private _name As String
Public Sub New(ByVal iname As String, ByVal iage As Integer)
_age = iage
_name = iname
End Sub
<Scriptable()> _
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
<Scriptable()> _
Public Property Age() As Integer
Get
Return _age
End Get
Set(ByVal value As Integer)
_age = value
End Set
End Property
End Class


从JavaScript来处理托管类的事件
在类中申明一个事件处理程序,这样以便于在JavaScript中调用.

注意
托管代码中的事代理可以使用基类EventArgs 类型, 如果他要返回一定的数据到JavaScript, 也可以使用自定义的从 EventArgs派生的类型.

添加[Scriptable] tag 到事件申明上.

注意
如果想要在JavaScript中进行调用,那么独立的属性和自定义的事件都需要标记上 [Scriptable] tag. 可以参照上一部分,关于如何使类成员变成JavaScript中可访问的对象.

cs

[Scriptable]
public event EventHandler<CustomEventArgs> AgeUpdatedEvent;


VB

<Scriptable()> _
Public Event AgeUpdatedEvent As EventHandler(Of CustomEventArgs)


在 Web page中创建一个本地的JavaScript 方法来处理托管代码事件, 给其传入一个与引发这个事件相关的对象的参数 (注册为可脚本化的对象),另外一个参数包含event arguments.

cs

function firedFromScriptableEvent(sender, args)

VB

function firedFromScriptableEvent(sender, args)


 在JavaScript中,调用开始注册创建的可脚本化的对象事件.将事件赋值为上一步创建好的JavaScript方法.

cs

control.Content.basic.AgeUpdatedEvent = firedFromScriptableEvent;


VB

control.Content.basic.AgeUpdatedEvent = firedFromScriptableEvent;


从JavaScript中调用托管代码中的类方法
给你开始注册的可脚本化的对象创建一个引用.

注意
在当前版本的 Silverlight中, 当你调用可脚本化的方法,输入参数和返回值都必须是strings 或primitive 类型.

在对象上调用[Scriptable] 标记的方法. 一般的, 你将把输出值赋给页面上某些UI element .接下来的示例代码就是将类方法返回的string值赋给了页面上的某个control.

cs

output.value = control.Content.basic.ReturnAString(input.value, parseInt(inputAge.value));


VB

output.value = control.Content.basic.ReturnAString(input.value, parseInt(inputAge.value));


使用JavaScript来得到或者设置托管类属性值
在托管代码中将要进行访问的属性标上 [Scriptable] 标记. 接下来的代码示例演示了一个[Scriptable] 属性.

cs

private int makeMeYounger = 0;
[Scriptable]
public int MakeMeYoungerProperty
{
get { return (makeMeYounger - 20); }
set { makeMeYounger = value; }
}


VB

Private makeMeYounger As Integer = 0
<Scriptable()> _
Public Property MakeMeYoungerProperty() As Integer
Get
Return makeMeYounger - 20
End Get
Set(ByVal value As Integer)
makeMeYounger = value
End Set
End Property


给你开始在托管代码中注册的可脚本化的Silverlight对象在JavaScript中创建一个引用.

直接设置或者是得到[Scriptable] 属性的值, 接下来的示例演示,当user单击一个按钮. JavaScript 代码创建一个Silverlight object的引用 , 设置属性值,得到属性值 (该值已经由刚才的过程而改变了), 然后显示出来.

注意
再一次, 注意 Content accessor 的调用来得到可脚本化的对象的引用.

cs

function CallMakeMeYounger()
{
var control = document.getElementById("agControl1");
var ageInput = parseInt("40");
control.Content.basic.MakeMeYoungerProperty = ageInput;
var retvalA = "I just set the MakeMeYounger managed code property using JavaScript to: " + ageInput.toString();
alert(retvalA);
var retvalB = "I just updated the MakeMeYounger property value in managed code to: " + control.Content.basic.MakeMeYoungerProperty;
alert(retvalB);
}


VB


function CallMakeMeYounger()
{
var control = document.getElementById("SilverlightControl");
var ageInput = parseInt("40");
control.Content.basic.MakeMeYoungerProperty = ageInput;
var retvalA = "I just set the MakeMeYounger managed code property using JavaScript to: " + ageInput.toString();
alert(retvalA);
var retvalB = "I just updated the MakeMeYounger property value in managed code to: " + control.Content.basic.MakeMeYoungerProperty;
alert(retvalB);
}

拥有帝国一切,皆有可能。欢迎访问phome.net

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面

特别推荐