【问题标题】:Silverlight Control Caching in IEIE 中的 Silverlight 控件缓存
【发布时间】:2014-01-31 09:43:22
【问题描述】:

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

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

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

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

TIA 安德鲁

【问题讨论】:

    标签: javascript silverlight internet-explorer silverlight-5.0


    【解决方案1】:

    我不确定我有一个整体的想法。提高 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;
            }
    

    其中 data 是您的重新初始化参数...

    希望对你有帮助

    【讨论】:

    • 是的,设置相当复杂。但设法找到答案我会在下面添加它
    • 从 Tech perceptive 来看,这很好。这只是另一种实现方式,并且肯定会奏效。此外,您可能会发现关于 onLoad 的对话很有用stackoverflow.com/questions/1874866/…
    【解决方案2】:

    下面是打开包含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) 更改为在打开对话框时始终调用但检查标志 (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 中,初始化永远不会被多次调用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-30
      • 2012-05-21
      • 2011-04-06
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多