如何确保在tabcontrol中加载WPF WebBrowser

时间:2011-02-08 12:02:18

标签: wpf c#-4.0 webbrowser-control

我的WPF应用程序中的tabcontrol中嵌入了一个WebBrowser,如下所示。

<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始终显示webbrowser的第一个渲染屏幕。我必须右键单击并在tabview上说刷新以查看webbrowser的更新内容。仔细检查后,问题将被跟踪到webbrowser,即使指定了不同的源(或调用navigate(),refresh()....),也不会加载该问题。在前面的代码中,布尔变量isloa为false。

有人可以为这个问题提供一些启示。我看到有人使用thread.sleep()作为window_loaded中的最后一个方法来解决类似的问题。有没有更好的方法?

1 个答案:

答案 0 :(得分: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:// server /?param1 = x&amp; param2 = y&amp; timestamp =”+ DateTime.Ticks.ToString())