0

HTML で Silverlight コントロールを非表示にしようとしています。問題は、非表示のコードが Silverlight コントロールによって呼び出された場合、それを再度表示した後、Silverlight がリロードされ、Silverlight コントロール内のすべてのデータが失われることです。

以下は、問題を示す簡単なサンプルです。Silverlight コントロール: mainpage.xaml

<Grid x:Name="LayoutRoot" Background="White">
    <Button Content="Hide" Height="23" HorizontalAlignment="Left" Margin="118,210,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    <sdk:Label Height="28" HorizontalAlignment="Left" Margin="44,92,0,0" Name="label1" VerticalAlignment="Top" Width="323" />
</Grid>

MainPge.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Browser;

namespace SilverlightApplication1
{
public partial class MainPage : UserControl
{
    [ScriptableMember()]
    public event EventHandler TestEvent;

    public string timeStr;

    public MainPage()
    {
        InitializeComponent();
        this.label1.Content = DateTime.Now.ToShortTimeString();
        HtmlPage.RegisterScriptableObject("Control", this);

        timeStr = DateTime.Now.ToString();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        TestEvent(sender, new TestEventArgs());
    }

    [ScriptableMember]
    public string GetTime()
    {
        return timeStr;
    }
}

public class TestEventArgs : EventArgs
{
    [ScriptableMember()]
    public string Name { get; set; }

    public TestEventArgs() {
        this.Name = "Test";
    }
}
}

Test.html

  function show() {
document.getElementById("silverlightControlHost").style.visibility = "visible";
//document.getElementById("silverlightControlHost").style.display = "";
}

    function hide() {
        document.getElementById("silverlightControlHost").style.visibility = "hidden"; 
        //document.getElementById("silverlightControlHost").style.display = "none";
    }

    function showTime() {
        var timeStr = app.Content.Control.GetTime();
        document.getElementById("timeDiv").innerHTML = timeStr;
    }

    var app;
    function silverlightOnLoad() {
        alert("load");
        app = document.getElementById("silverlightApp");
        app.Content.Control.TestEvent = function (sender, arg) {
            //if you keep these two alert statement. while the first one works fine,     //you can see the second one would
            //throw an error after the silverlight control is hidden.
            // alert(arg.Name);
            hide(); 
            //alert(arg.Name);
        };
    }

 <input type="button" id="btnShow" value="Show" onclick="show();" />
<input type="button" id="btnHide" value="Hide" onclick="hide();" />
<input type="button" id="Button1" value="Show Time" onclick="showTime();" />
<div id="timeDiv">

</div>
<div id="silverlightControlHost">
    <object id="silverlightApp" data="data:application/x-silverlight-2," type="application/x-silverlight-2"
        width="100%" height="100%">
        <param name="source" value="ClientBin/SilverlightApplication1.xap" />
        <param name="onLoad" value="silverlightOnLoad" />
        <param name="onError" value="onSilverlightError" />
        <param name="background" value="white" />
        <param name="minRuntimeVersion" value="5.0.61118.0" />
        <param name="autoUpgrade" value="true" />
        <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=5.0.61118.0" style="text-decoration: none">
            <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight"
                style="border-style: none" />
        </a>
    </object>
    <iframe id="_sl_historyFrame" style="visibility: hidden; height: 0px; width: 0px;
        border: 0px"></iframe>
</div>

HTML から「非表示」ボタンで Silverlight コントロールを非表示にすると、すべて正常に動作します。ただし、Silverlight コントロールからボタンでコントロールを非表示にすると、[表示] ボタンをクリックすると、silverlightOnLoad が再度呼び出されます。何か助けはありますか?

4

1 に答える 1

0

http://forums.silverlight.net/p/17061/57793.aspxに似ています。

簡単に言えば、Silverlight プラグインは、プラグインがフォーカスされているときに非表示にしようとすると終了します。プラグインを非表示にする前に、次の呼び出しを試みますwindow.focus();(または、HTML ページ上の他のフォーカス可能な要素にフォーカスを設定します)。

app.Content.Control.TestEvent = function (sender, arg) {
  window.focus();
  hide(); 
};
于 2012-06-30T12:27:16.320 に答える