【问题标题】:How can I call javascript functions and pass values from XAML/Silverlight?如何调用 javascript 函数并从 XAML/Silverlight 传递值?
【发布时间】:2009-06-18 12:57:41
【问题描述】:

我在没有 Visual Studio 的情况下创建 silverlight。我只有原始 html、XAML 和 js (javascript)。

我想要做的是将值从 XAML 传递到 javascript。我可以从 XAML 调用和激活 javascript 函数。见下文。 canvas 元素有一个鼠标左键向上事件,该事件在 javascript 中调用 LandOnSpace。

但是我该如何调用 ShowMsg 呢?或者更准确地说,我将如何将值传递给该调用?通常在 javascript 中你可以这样: ShowMsg(500, 700, "you owe us money");

但是当我在 xaml 代码中尝试这样做时,它会破坏一些东西。我相信它抱怨javascript函数不存在。

        <Canvas x:Name="btnLandOnSpace" Background="LightGreen" MouseLeftButtonUp="LandOnSpace"
            Cursor="Hand" Canvas.Top ="0"  Width="70" Height="50"> 
            <TextBlock Text="LandOnSpace"  />
            </Canvas>

function LandOnSpace(sender, e) {  //on server
if (!ShipAnimateActive && !blnWaitingOnServer) {
    blnWaitingOnServer = true;
    RunServerFunction("/sqgame/getJSLLandOnSpace");
        ShowWaitingBox();
        };
else {
    alert('Waiting on server.');
};
}



function ShowMsg(SintCost, SintRent , SstrChoiceText) { 
blnPayChoice = true;    
intCost = SintCost;     
intRent = SintRent;     
strChoiceText = SstrChoiceText;   } 

【问题讨论】:

  • 考虑到所有问题,改用月光而不是银光对我有好处吗?我也可能完全放弃silverlight 并使用google 的O3D 进行渲染。它可以很容易地处理我想做的 2d 事情。
  • 我也一直在研究使用 HTML 5 中的 Canvas 标签。然后我的浏览器支持将是每个浏览器。 IE 显然以一种或另一种方式支持它。
  • 这很有趣:blog.jimmy.schementi.com/2008/05/… 有一种叫做 chiron 的东西可以帮助我。

标签: javascript silverlight xaml syntax function


【解决方案1】:

如果您想从 Silverlight 2.0 调用 javascript 函数,您可以使用 System.Windows.Browser 命名空间中的 HtmlPage。

var param = new object[] {"some parameter"};
HtmlPage.Window.Invoke("myfunc",param);

但是,根据您上面的示例,您似乎使用的是 Silverlight 1.0,其中您的事件处理程序是 Javascript 而不是 C# 或 VB。

您可以迁移到 Silverlight 2.0。您用于服务器页面的服务器不会阻止您使用 Silverlight 2.0(或 3.0)。 您可以在 Google App Engine 上完美运行 Silverlight 2.0 应用程序。

要开始在 2.0 中进行开发,请在此处下载 Silverlight 2 工具:http://www.microsoft.com/downloadS/details.aspx?familyid=C22D6A7B-546F-4407-8EF6-D60C8EE221ED&displaylang=en

有关如何在 Silverlight 托管代码和浏览器内的 Javascript 之间进行通信的一些参考,您可以查看此页面:http://msdn.microsoft.com/en-us/library/cc645076(VS.95).aspx

【讨论】:

  • 哇。嗯,我的 javascript 文件中已经有大约 3000 行代码。我会看看我能做些什么来开始将它连接到托管代码。或者至少在我的谷歌应用引擎网站上测试一些托管代码。我的下一个项目将以这种方式开始。我的代码已经使用 3 种语言,.JS、.XAML 和 Python。我不确定我现在应该扔 vb .net。我知道 vb,但到目前为止,没有它,该项目已经走了很长一段路。我会在某个时候进行实验。谢谢。
【解决方案2】:

执行此操作的正确方法是使用默认参数触发 js 处理程序。然后,从 Javascript 中,使用 Silverlight 1.0 模型导航到 XAML。请参阅Silverlight 1.0 docs。请参阅 FindName 方法。

【讨论】:

  • 这就是我现在所做的。例如,我将 xaml 元素的名称更改为包含它会传递的 ID 号。例如,我会将 x:Name="btnLandOnSpace" 更改为 x:Name="btnLandOnSpace05"。并且 javascript 将使用 sender.name 来获取和解析名称。但是不能直接传递变量吗?我可以想到我想要或需要传递另一个变量的场景。我想我可以在名称中嵌入多个值,但这看起来很乱。
  • 实际上不可能将值直接传递给处理程序,不。尤其是在使用 1.0 (JS) 编程模型时。如果您将 SL 2 与 Prism Commanding 一起使用,那么,那又是另一回事了 ;)
  • 你是说我只用JS连silverlight 2都不能用?我可以发誓我已经实现了 Silverlight 2 功能。我在谷歌应用引擎网站上运行该页面,所以我不能只切换到.net,不幸的是,据我所知。不过,我测试了可以在不同服务器上实现 silverlight 的所有方法。我很确定我需要一个 .net 3.0 服务器来托管任何其他类型的 silverlight 页面。这是正确的吗?我应该在这里提出一个新问题吗?
  • 当您将 Javascript 与 Silverlight 一起使用时,我们将其称为 Silverlight 1.0 编程模型。它在 Silverlight 1.0 和 Silverlight 2 和 Silverlight 3 中可用。两件事: Silverlight 可以在客户端上运行 .net。我强烈建议您查看此“托管”模型。 Silverlight 不需要服务器上的 .Net。
猜你喜欢
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多