我有一个WPF服务器托盘应用程序,它为UWP应用程序的WebView提供本地html内容。为了正确计算Storyboard动画的时间,我需要尝试利用WebView.NavigationCompleted事件,但是从我的服务器应用程序加载内容时它不会触发。
经过一些故障排除后,我已将其缩小到我的服务器是问题所在。它不是html内容本身,因为如果我使用NavigateToString加载相同的页面,那么事件将会正常。如果定期导航到来自互联网的URI(例如https://google.com),那么事件也会触发。只有当从我的服务器获取html它没有触发时(除非我退出服务器,然后它会在10秒后触发)。我对HTTP知之甚少,不知道WebView没有收到会触发事件的内容。
客户端代码(UWP):
private UIElement MyUIElement;
private int AnimationDuration;
private WebView MyWebView;
public async void ChangeBackground(UIElement uIElement, int animationDuration)
{
MyUIElement = uIElement;
MyWebView = MyUIElement.GetChildOfType<WebView>();
MyWebView.NavigationCompleted += WebView_NavigationCompleted;
MyWebView.DOMContentLoaded += WebView_DOMContentLoaded;
AnimationDuration = animationDuration;
var hideAnimation = MyUIElement.Fade(0, AnimationDuration);
hideAnimation.Completed += HideAnimation_Completed;
await hideAnimation.StartAsync();
}
private void HideAnimation_Completed(object sender, AnimationSetCompletedEventArgs e)
{
MyWebView.Navigate(myUriFromMyLocalServer);
}
private void WebView_DOMContentLoaded(WebView sender, WebViewDOMContentLoadedEventArgs args)
{
// this fires
}
private void WebView_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)
{
// this doesn't fire
}
服务器代码(WPF):
private void ResponseHtmlContent(HttpListenerContext context, string htmlFileStr)
{
context.Response.ContentType = "text/html";
byte[] byteArray = Encoding.ASCII.GetBytes(htmlFileStr);
context.Response.OutputStream.Write(byteArray, 0, byteArray.Length);
context.Response.StatusCode = (int)HttpStatusCode.OK;
context.Response.KeepAlive = false;
context.Response.OutputStream.Flush();
context.Response.Close();
}
我尝试过不同的Flush,Close和Dispose变体,但似乎没有一个可以解决这个问题。