代码之家  ›  专栏  ›  技术社区  ›  Phil

使用Silverlight 3的htmlpage.window.navigate方法重新使用已打开的浏览器窗口

  •  3
  • Phil  · 技术社区  · 16 年前

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

    为了达到这个目的,我只需要

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

    很好用。

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

    选项1 -使用导航方法的重载,如:

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

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

    选项2 -在HTML页上使用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()方法尝试了相同的方法,每次窗口都是空的,所以每次单击都会打开一个新窗口。我检查了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 回复  |  直到 16 年前
        1
  •  3
  •   AnthonyWJones    16 年前

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

    承载Silverlight控件的网页将从“”运行 http://www.yoursite.com 因此,只有当名为“foo”的窗口当前也显示来自的内容时,它才能重新使用该窗口。 网址:http://www.yoursite.com “。因为你已经加载了“ http://www.bing.com “在该窗口中,上下文中运行的代码不再可见” 网址:http://www.yoursite.com “。因此,当您使用“foo”打开一个窗口时,浏览器不会看到具有该名称的当前窗口,因此会创建另一个窗口。

        2
  •  0
  •   slugster Joey Cai    16 年前

    您确定这不是由浏览器设置引起的吗?我用 HtmlPage.Window.Navigate(new Uri(url)) 它总是导航我的Silverlight控件所在的当前选项卡。

        3
  •  0
  •   Phil    16 年前

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