2010-03-24 22 views
3

我想使用外部瀏覽器窗口在Silverlight應用程序中實現預覽功能。有一個項目列表,當用戶點擊其中一個項目時,它會在一個單獨的瀏覽器窗口中打開(內容是一個pdf文檔,這就是爲什麼它在SL應用程序的外部處理)。使用Silverlight 3的HtmlPage.Window.Navigate方法重用已打開的瀏覽器窗口

現在,爲了實現這一目標,我只是用

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

工作正常。

現在我的客戶不喜歡每次點擊打開一個新的瀏覽器窗口的事實。他希望每次單擊某個項目時都會重新使用瀏覽器窗口。所以,我走了出去,並試圖實現這一點:

選項1 - 使用導航方法的過載,像這樣:

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

我是假設該窗口將被再次使用時,相同的目標參數值(foo)將在隨後的調用中使用。
這不起作用。我每次都會看到一個新窗口。

選項2 - 使用在HtmlPage

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

這不起作用PopupWindow方法。我每次都會看到一個新窗口。

選項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專家,所以我希望這是我在這裏失蹤的事情。

乾杯, 菲爾

回答

0

顯然,問題是導航到bing.com時,window.name屬性會丟失。當我導航到我的一個自定義頁面時,它似乎工作正常。

0

你確定這是不是一個瀏覽器設置造成的?我使用HtmlPage.Window.Navigate(new Uri(url)),它總是瀏覽我的Silverlight控件所在的當前選項卡。

+0

對不起,我使用 HtmlPage.Window.Navigate(新的URI( 「http://www.bing.com」), 「_blank」); atm,它工作正常,因爲我想讓它在新窗口中打開。 – Phil 2010-03-24 10:12:11

3

這是瀏覽器的安全功能。命名窗口的重新使用僅限於當前由該窗口顯示的文檔的域。

您的託管Silverlight控件的頁面將從「http://www.yoursite.com」運行,因此,如果該窗口當前也顯示「http://www.yoursite.com」的內容,則它只能重新使用名爲「foo」的窗口。由於您已加載「http://www.bing.com」到該窗口不再在上下文「http://www.yoursite.com」運行的代碼可見。因此,當您使用「Foo」打開窗口時,瀏覽器不會看到具有該名稱的當前窗口,因此會創建另一個窗口。

相關問題