2011-02-08 41 views
0

我有一個WebBrowser嵌入在我的WPF應用程序中的tabcontrol,如下所示。如何確保WPF WebBrowser加載在tabcontrol

<Grid> 
    <TabControl SelectionChanged="tabwindow_SelectionChanged"> 
     <TabItem Header="Preview" Name="PreviewWindow"> 
      <WebBrowser x:Name="PreviewBrowser" Loaded="PreviewBrowser_OnLoad"/> 
     </TabItem> 
     <TabItem Header="XML"> 
      <ew:CommonXmlEditor 
        x:Name="rawXmlEditor" 
        DataContext="{Binding ElementName=XMLDockMainWindow}" 
        ShowLineNumbers="True" 
        FontFamily="Consolas" 
        FontSize="10pt" 
        SyntaxHighlighting="XML" 
        ContextMenu="{StaticResource XmlEditorContextMenu}"/> 
     </TabItem> 
     <TabItem Header="Not Used"> 
      The Mushrooms Tab 
     </TabItem> 
    </TabControl> 
</Grid> 

在tabwindow_SelectionChanged()事件我想如下

private void tabwindow_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     string previewFile = "/session/PreviewXml.data"; 
     XmlMethodCall.Instance.Put(previewFile, this.XmlEditor.Text, true); 
     //WebBrowser browser = new WebBrowser(); 
     string urlForPreview = XmlMethodCall.Instance.ServerUri.ToString() + "/admin/framework/form_preview.php?path=" + previewFile; 
     App app = Application.Current as App; 
     string sessionState = XmlMethodCall.Instance.HttpResponse.Headers.Get("Cookie"); 
     int index = sessionState.IndexOf(";"); 
     if (index >= 0) 
     { 
      sessionState = sessionState.Substring(0, index); 
     } 
     sessionState = sessionState.Replace("ESPSessionState=", ""); 
     InternetSetCookie(XmlMethodCall.Instance.ServerUri.ToString() + "/admin/", "EspSessionId", sessionState); 
     PreviewBrowser.Source = new Uri(urlForPreview); 
     PreviewBrowser.Navigate(urlForPreview); 
     bool isloa = PreviewBrowser.IsLoaded; 
    } 

更新瀏覽器的內容,但是,TabView的總是顯示網頁瀏覽器的第一個渲染畫面。我必須右鍵單擊並在tabview上進行刷新以查看webbrowser的更新內容。在進一步檢查時,問題會跟蹤到webbrowser,即使指定了其他源(或調用navigate(),refresh()....),webbrowser也不會加載。在前面的代碼中,布爾變量isloa是false。

有人可以投訴一些問題。我看到有人使用thread.sleep()作爲window_loaded中的最後一個方法來解決類似的問題。有沒有更好的方法?

回答

2

Jimmy,在我的示例中,當您在地址文本框中鍵入一些URI,然後切換到預覽選項卡 - 瀏覽器內容將像往常一樣加載和呈現。

<TabControl SelectionChanged="TabControl_SelectionChanged"> 
    <TabItem Header="Preview" Name="PreviewWindow"> 
     <WebBrowser x:Name="PreviewBrowser" Loaded="PreviewBrowser_Loaded"/> 
    </TabItem> 
    <TabItem Header="XML"> 
     <TextBox Name="Address"/> 
    </TabItem> 
    <TabItem Header="Not Used"> 
     The Mushrooms Tab 
    </TabItem> 
</TabControl> 

    private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (string.IsNullOrEmpty(Address.Text)) 
     { 
      PreviewBrowser.Navigate("http://google.com"); 
     } 
     else 
     { 
      PreviewBrowser.Navigate(Address.Text); 
     } 
    } 

我想問題是在行PreviewBrowser.Source之前的魔術。例如,我可以假設在你的場景中URI不會改變(你只是上傳另一個數據),所以當你調用Navigate什麼都沒有發生,因爲瀏覽器可能認爲你正在請求同一頁面。

嘗試添加到URI一些參數,從請求來請求不同而不同,時間戳將是完美的( 「HTTP://服務器/參數1 = X & param2的= Y &時間戳=」 + DateTime.Ticks.ToString() )。

+0

@ Alex-非常好。非常感謝你。 – Jimmy 2011-02-08 12:35:34