在WInRT应用程序中下载WebView内容

时间:2015-12-09 15:40:12

标签: javascript c# webview windows-runtime winrt-xaml

我正在尝试为Windows 10构建一个通用rss应用程序,该应用程序可以下载完整文章页面的内容以供离线咨询。

所以在花了很多时间在stackoverflow上之后我发现了一些代码:

HttpClientHandler handler = new HttpClientHandler { UseDefaultCredentials = true, AllowAutoRedirect = true };
HttpClient client = new HttpClient(handler);
HttpResponseMessage response = await client.GetAsync(ni.Url);
response.EnsureSuccessStatusCode();
string html = await response.Content.ReadAsStringAsync();

但是,此解决方案不适用于动态调用内容的某个网页。

所以剩下的替代方案似乎就是:将网页加载到WinRT的Webview控件中,然后以某种方式复制并粘贴渲染的文本。 但是,Webview没有实现任何复制/粘贴方法或类似方法,所以没有办法轻松实现。

最后我发现stackoverflow(Copying the content from a WebView under WinRT)上的这篇文章似乎正在处理与我的相同的问题,并使用以下解决方案;

使用webview中的InvokeScript方法通过javascript函数复制和粘贴内容。

它说:"首先,这个javascript函数必须存在于webview中加载的HTML中。"

function select_body() {
var range = document.body.createTextRange(); 
range.select();
}

然后"使用以下代码:"

// call the select_body function to select the body of our document
MyWebView.InvokeScript("select_body", null);

// capture a DataPackage object
DataPackage p = await MyWebView.CaptureSelectedContentToDataPackageAsync();

// extract the RTF content from the DataPackage
string RTF = await p.GetView().GetRtfAsync();

// SetText of the RichEditBox to our RTF string
MyRichEditBox.Document.SetText(Windows.UI.Text.TextSetOptions.FormatRtf, RTF);

但它没有说的是如果在我填写的页面中不存在javascript函数的方法如何注入?

1 个答案:

答案 0 :(得分:1)

如果你有这样的WebView:

<WebView Source="http://kiewic.com" LoadCompleted="WebView_LoadCompleted"></WebView>

InvokeScriptAsynceval()结合使用以获取文档内容:

private async void WebView_LoadCompleted(object sender, NavigationEventArgs e)
{
    WebView webView = sender as WebView;
    string html = await webView.InvokeScriptAsync(
        "eval",
        new string[] { "document.documentElement.outerHTML;" });

    // TODO: Do something with the html ...
    System.Diagnostics.Debug.WriteLine(html);
}