views:

1337

answers:

4

Hi,

I want to use an external browser window to implement a preview functionality in a silverlight application. There is a list of items and whenever the user clicks one of these items, it's opened in a separate browser window (the content is a pdf document, which is why it is handled ouside of the SL app).

Now, to achieve this, I simply use

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

which works fine.

Now my client doesn't like the fact that every click opens up a new browser window. He would like to see the browser window reused every time an item is clicked. So I went out and tried implementing this:

Option 1 - Use the overload of the Navigate method, like so:

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

I was assuming that the window would be reused when the same target parameter value (foo) would be used in subsequent calls.
This does not work. I get a new window every time.

Option 2 - Use the PopupWindow method on the HtmlPage

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

This does not work. I get a new window every time.

Option 3 - Get a handle to the opened window and reuse that in subsequent calls

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");
}

This does not work. I tried the same for the PopupWindow() method and the window is null every time, so a new window is opened on every click. I have checked both the EnableHtmlAccess and the IsPopupWindowAllowed properties, and they return true, as they should.

Option 4 - Use Eval method to execute some custom 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);
}

This does not work. I get a new window every time.

option 5 - Use CreateInstance to run some custom javascript on the page

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

and in my aspx I have

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

This doesn't work. I get a new window every time.

Am I doing something wrong? I'm definitely no javascript expert, so I'm hoping it's something obvious I'm missing here.

Cheers, Phil

A: 

Are you sure it isn't a browser setting causing this? I use HtmlPage.Window.Navigate(new Uri(url)) and it always navigates the current tab that my silverlight control is sitting in.

slugster
Sorry, I'm using HtmlPage.Window.Navigate(new Uri("http://www.bing.com"), "_blank");atm, which works fine, as I want to have it opening up in a new window.
Phil
A: 

Apparently the problem is that the window.name property is lost when navigating to bing.com. When I navigate to one of my custom pages it seems to be working fine.

Phil
+1  A: 

This is a security feature of the browser. The re-use of named windows is limited to the domain of the document current being displayed by that window.

Your page hosting the Silverlight control will be running from "http://www.yoursite.com" hence it can only re-use window named "foo" if that window is also currently showing content from "http://www.yoursite.com". Since your have loaded "http://www.bing.com" into that window it is no longer visible to code running in the context "http://www.yoursite.com". Hence when you open a window using "Foo" the browser doesn't see a current window with that name and hence creates another one.

AnthonyWJones
A: 

I have the opposite problem. I want to open each time a new Window. It does open a new window each time from the localhost, but when it is in the Internet it allways open in the last window, so the user does not know it's opened, because that window is in the background.

I have used javascript plus randome numbers, i am out of ideas of what else I can do.

Help pls, Lina

Lina Manjarres