htmlでsilverlightコントロールを非表示にしようとしています。問題は、非表示のコードがSilverlightコントロールによって呼び出され、再び表示され、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が再度呼び出されます。どんな助け?