IE中的Silverlight控件缓存

时间:2014-01-31 09:43:22

标签: javascript silverlight internet-explorer silverlight-5.0

嗨我们有一个隐藏div(和高度为0px)的silverlight控件,当用户点击页面按钮时,它会显示在jquery对话框中 对话框的初始显示调用onLoad参数并正确初始化silverlight控件。但是,用户可以选择关闭对话框并隐藏silverlight控件。

然后,用户可以再次显示此对话框(无需重新加载页面),但是,在IE中,onLoad参数未被触发,因此我们的Silverlight控件未正确初始化,因为我们正在处理其中的硬件。但是,在Chrome中,每次显示jquery对话框时都会触发onLoad参数

两种截然不同的行为。我无法从dom中移除隐藏的div,因为它可能需要再次使用

是否有强制重新加载silverlight控件的解决方案,以便每次使用jquery对话框显示控件时都会触发param onLoad?

TIA 安德鲁

2 个答案:

答案 0 :(得分:0)

不确定我是否有一个整体想法。提升onLoad绝对不是好事。 但是让我建议上面的解决方案。

在JS和silverlight中注册通信对象(也称为函数)。所以你将能够沟通JS - > Silverlight

<script type="text/javascript">
    function updateSilverlight() {
        // call silverlight control method
        var control = document.getElementById("silverlightControl");
        control.Content.Page.SomeMethod("someData');
    } 
</script>

注释这样的类:

 [ScriptableType]
    public partial class SomePage: UserControl
    {

在SomePage中注释适当的方法

  [ScriptableMember]
        public void SomeMethod(string somedata)
        {
            var data = somedata;
        }

数据是你的重新启动参数......

希望有所帮助

答案 1 :(得分:0)

下面是打开包含silverlight控件的对话框的代码

$('#ReadCard').on('click', function (e) {

    $('#silverlightControlHost').height('300');

    e.preventDefault();

    //show the read card dialog
    $("#readCardDialog").dialog({
        autoOpen: true,
        height: 390,
        width: 550,
        modal: true,
        resizable: false,
        buttons: {
            'Close': function () {
                Call_SL_OnBeforeUnload();
                $(this).dialog("close");
            }
        }
    });
});

在加载silverlight控件时,有一个方法调用SilverlightInitialisation:

    function onSilverlightLoad(sender, eventargs) {
    .....
    pluginElem.Content.SR_SMT.SilverlightInitialisation(inputArray);
     }

可选的silverlight参数调用了:

  <param name="onload" value="onSilverlightLoad" />

这启动了silverlight控制器正在与之交谈的硬件。

当对话框关闭时,调用该方法来停止硬件:

Call_SL_OnBeforeUnload();

然而,当在IE中再次显示对话框时,除非用户刷新页面,否则永远不会调用SilverlightInitialisation方法。

解决方法是将方法(OnLoad)更改为在打开对话框时始终调用的silverlight控件,但是检查了一个标志(hasLoaded)以查看它是否先前已加载:

Silverlight的

[ScriptableMember]
    public string OnLoad()
    {
        string retVal = G4T.SilverlightBadge.Resources.ResourcesFile.Present_Card;

        if (_badgeReadCtrl != null && hasLoaded)
        {
            if (!_badgeReadCtrl.Initialise())
            {
                retVal = "Failed to initialise reader device";
            }
        }

        return retVal;
    }

添加了OnFirstLoad方法,该方法在首次加载silverlight控件时调用,并相应地设置标记

[ScriptableMember]
    public string OnFirstLoad()
    {
        string retVal = G4T.SilverlightBadge.Resources.ResourcesFile.Present_Card;

        if (_badgeReadCtrl != null)
        {
            if (!_badgeReadCtrl.Initialise())
            {
                retVal = "Failed to initialise reader device";
            }
        }
        hasLoaded = true;
        return retVal;
    }

的Javascript

 open: function (event, ui) {
            try {
                var plugin = document.getElementById('SilverlightMainControl');
                if (plugin) {
                    plugin.Content.SR_SMT.OnLoad();
                }
            }
            catch(e){}
        },

就像我上面所说的那样,这一直在Chrome中没有修改,但在IE中,初始化从未被调用过多次

希望这一切都有意义 - 但我必须将其记录下来以备将来参考