我的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中的最后一个方法来解决类似的问题。有没有更好的方法?
答案 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())