2011-02-08 73 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