【问题标题】:How to call javascript function on a Silverlight 3 object?如何在 Silverlight 3 对象上调用 javascript 函数?
【发布时间】:2010-01-12 17:48:58
【问题描述】:

我定义了以下 Silverlight 控件:

<object id="objImageViewer" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="500px">
    <param name="source" value="../ClientBin/SomeImageViewer.xap"/>
    <param name="onError" value="onSilverlightError" />
    <param name="background" value="white" />
    <param name="minRuntimeVersion" value="3.0.40624.0" />
    <param name="autoUpgrade" value="true" />
    <param name="windowless" value="true" />
    <param name="initParams"
        value="
            Username=<%= ImageViewerUsername %>,
            Editable=<%= ImageViewerEditable ? "1" : "0" %>,
            Align=<%= ImageViewerAlign ? "1" : "0" %>
            " />
    <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration:none">
        <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none"/>
    </a>
</object>

我在我的 Silverlight 控件 (Page.xaml.cs) 中公开了以下方法,以便 Javascript 可以访问:

[ScriptableMember]
public bool HasPendingUpdates()
{
    return btnSave.IsEnabled;
}

然后我在我的 aspx 页面中有一个 Javascript 测试函数,它试图用它做一些事情:

var imageViewer = $("#objImageViewer")[0];
if (imageViewer.Content.Page.HasPendingUpdates())
{
    alert("Pending Changes Exist!");
}
else
{
    alert("NO Pending Changes Exist!");
}

问题是在Content 对象之后失败。我已经测试了以下内容:

var imageViewer = $("#objImageViewer")[0];

imageViewer // Valid
imageViewer.Content // Valid
imageViewer.Content.Page  // Invalid
imageViewer.Content.HasPendingUpdates()  // Invalid

所以我不确定我做错了什么。如何访问 Content 中的功能?

我正在使用 IE8、Silverlight 3、ASP.NET。 silverlight 控件是使用对象标签创建的,因为我认为该控件不是 Silverlight 3+ 中的选项。

任何帮助将不胜感激。

【问题讨论】:

    标签: asp.net javascript jquery silverlight silverlight-3.0


    【解决方案1】:

    您需要向 Silverlight HTMLBridge 注册一个标识符以在 Content 属性上公开,并为其提供一个具有一些可编写脚本入口点的对象。

    我倾向于在 Page 构造函数中这样做:-

    public Page()
    {
         InitializeComponent();
         HtmlPage.RegisterScriptableObject("Page", this);
    }
    

    现在您的代码应该可以工作了。

    【讨论】:

    • 完美。看来已经修好了!
    【解决方案2】:

    我有这个 Silverlight 应用程序结构:

    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            Page uploadControl = new Page();
            // ...
            HtmlPage.RegisterScriptableObject("uploadControl", uploadControl);
        }
    }
    
    [ScriptableType]
    public partial class Page : UserControl
    {
        [ScriptableMember]
        public void StartUpload()
        {
            // ...
        }
    } 
    

    并且,在 Javascript 中:

    function startUpload() {
        $find("<%= SilverlightUpload.ClientID %>")
            .get_element().content.uploadControl.StartUpload();
        return false;
    }
    

    所以,我看一下 HtmlPage.RegisterScriptableObject 调用,只公开标记为 [ScriptableType] 的类型

    【讨论】:

    • ScriptableType 标记Page 类使ScriptableMember 属性变得多余,因为ScriptableType 使该类定义的所有公共成员都可编写脚本。大多数情况下,您希望使用ScriptableMember 显式公开特定的公共成员,而不是使用ScriptableType 来装饰类本身
    • 我不知道,安东尼
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2017-11-04
    相关资源
    最近更新 更多