使用Silverlight 3的HtmlPage.Window.Navigate方法重用已经打开的浏览器窗口

时间:2010-03-24 09:19:54

标签: javascript silverlight browser silverlight-3.0 navigation

我想使用外部浏览器窗口在silverlight应用程序中实现预览功能。有一个项目列表,每当用户点击其中一个项目时,它就会在一个单独的浏览器窗口中打开(内容是一个pdf文档,这就是SL应用程序处理的原因)。

现在,要实现这一点,我只需使用

HtmlPage.Window.Navigate(new Uri("http://www.bing.com"), "_blank");

工作正常。

现在我的客户不喜欢每次点击都会打开一个新的浏览器窗口这一事实。他希望每次点击一个项目时都重复使用浏览器窗口。所以我出去试图实现这个:

选项1 - 使用Navigate方法的重载,如下所示:

HtmlPage.Window.Navigate(new Uri("http://www.bing.com"), "foo");

我假设当后续调用中使用相同的目标参数值(foo)时,窗口将被重用。
这不起作用。我每次都会看到一个新窗口。

选项2 - 在HtmlPage上使用PopupWindow方法

HtmlPage.PopupWindow(new Uri("http://www.bing.com"), "blah", new HtmlPopupWindowOptions());

这不起作用。我每次都会看到一个新窗口。

选项3 - 获取已打开窗口的句柄并在后续调用中重复使用

private HtmlWindow window;
private void navigationButton_Click(object sender, RoutedEventArgs e)
{
    if (window == null)
        window = HtmlPage.Window.Navigate(new Uri("http://www.bing.com"), "blah");
    else
        window.Navigate(new Uri("http://www.bing.com"), "blah");

    if (window == null)
        MessageBox.Show("it's null");
}

这不起作用。我为PopupWindow()方法尝试了相同的操作,每次窗口都为null,因此每次单击都会打开一个新窗口。我检查了EnableHtmlAccess和IsPopupWindowAllowed属性,它们返回true as they should

选项4 - 使用Eval方法执行一些自定义javascript

private const string javascript = @"var popup = window.open('', 'blah') ; 
                                    if(popup.location != 'http://www.bing.com' ){
                                        popup.location = 'http://www.bing.com';
                                    }
                                    popup.focus();";

private void navigationButton_Click(object sender, RoutedEventArgs e)
{
    HtmlPage.Window.Eval(javascript);
}

这不起作用。我每次都会看到一个新窗口。

选项5 - 使用CreateInstance在页面上运行一些自定义javascript

private void navigationButton_Click(object sender, RoutedEventArgs e)
{
    HtmlPage.Window.CreateInstance("thisIsPlainHell");
}

在我的aspx中我有

function thisIsPlainHell() {
    var popup = window.open('http://www.bing.com', 'blah');
}

这不起作用。我每次都会看到一个新窗口。

我做错了吗?我绝对不是javascript专家,所以我希望这里有一些显而易见的东西。

干杯, 菲尔

3 个答案:

答案 0 :(得分:3)

这是浏览器的安全功能。命名窗口的重用仅限于该窗口显示的当前文档的域。

托管Silverlight控件的页面将从“http://www.yoursite.com”运行,因此如果该窗口当前还显示“http://www.yoursite.com”内容,则只能重新使用名为“foo”的窗口。由于您已将“http://www.bing.com”加载到该窗口中,因此在上下文“http://www.yoursite.com”中运行的代码不再可见。因此,当您使用“Foo”打开一个窗口时,浏览器不会看到具有该名称的当前窗口,因此会创建另一个窗口。

答案 1 :(得分:0)

您确定它不是导致此问题的浏览器设置吗?我使用HtmlPage.Window.Navigate(new Uri(url)),它总是导航我的silverlight控件所在的当前标签。

答案 2 :(得分:0)

显然问题是导航到bing.com时window.name属性丢失了。当我导航到我的一个自定义页面时,它似乎工作正常。