私のSilverlightは、ある時点で、新しいブラウザウィンドウを開く必要があります。これは問題ではありません。
しかし、開いているウィンドウが閉じていることに反応するのに問題があります(データを更新する必要があります)。さて、私が開いた新しいページがコールバックを実行できる(そして実行する)という事実がなければ、これは問題ではなかったでしょう。そのため、onbeforeunload
イベントは、ウィンドウが閉じられたときだけでなく、ページがコールバックを実行したときにも発生するため、それほど有用ではありません。
これが私が現在持っているコードです。
private void OpenAnnotation()
{
var window = HtmlPage.Window.Navigate(new Uri(/*url goes here*/)),
"_newWindow", "toolbar=0,menubar=0,resizable=1,scrollbars=1");
SetWindowCallback(window, TimeSpan.FromSeconds(0.5)); //Delay needed, the OS needs at least some time to display the new window.
}
private void SetWindowCallback(HtmlWindow window, TimeSpan delay)
{
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
System.Threading.Thread.Sleep(delay);
UIDispatcher.Invoke(() =>
{
if (window != null && Helpers.HtmlWindow.WindowExists(window)) //WindowExists attemts to do Invoke("this") on the HtmlWindow; if it fails, it's likely the window doesn't exist
{
window.Eval(@"this.attachEvent('onbeforeunload',
function(){
var slObject = window.opener.document.getElementById('SL');
if (slObject != null)
slObject.Content.AnnotationControl.UpdateAttachmentInfo(this);
});");
}
});
});
}
[ScriptableMember]
public void UpdateAttachmentInfo(HtmlWindow window)
{
SetBusyIndicator(true);
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(2));
LoadAnnotation();
SetWindowCallback(window, TimeSpan.Zero);
});
}
私は本当に「ただ」ウィンドウが閉じられたときにデータを更新したいのですが、私はJSに制限されているようで、それは次に、言及されたコールバックに反応します。
これを行うためのより良い方法はありますか?
PS。開いているページのコードを偶然見つけることはできません!SLアプリケーションでしか作業できません。