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
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.