我在 WP8 中创建了一个简单的应用程序来使用 Microsoft.Phone.Controls.WebBrowser 类显示网页。我能够加载页面、导航链接、在历史记录中前后移动。除了这个基本功能之外,我还想提供下载无法在浏览器中显示的文件的方法,比如 .ppt 或 .mp3。
我无法在 WebBrowser 类文档中找到任何内容来启动下载。只有一个 Navigate 函数需要一个 URL 来加载。
那么可以使用 WebBrowser 类进行下载吗?
我在 WP8 中创建了一个简单的应用程序来使用 Microsoft.Phone.Controls.WebBrowser 类显示网页。我能够加载页面、导航链接、在历史记录中前后移动。除了这个基本功能之外,我还想提供下载无法在浏览器中显示的文件的方法,比如 .ppt 或 .mp3。
我无法在 WebBrowser 类文档中找到任何内容来启动下载。只有一个 Navigate 函数需要一个 URL 来加载。
那么可以使用 WebBrowser 类进行下载吗?
您必须拦截导航事件并自行处理。
以下代码示例应为您指明正确的方向。(你会想要完善它,我只是把它放在一起以表明它可以与我搜索测试 mp3 文件时出现在 Google 上的随机 mp3 网站一起使用)
using Microsoft.Phone.Controls;
using System;
using System.IO;
using System.IO.IsolatedStorage;
using System.Net;
using System.Threading.Tasks;
using System.Windows;
namespace PhoneApp2
{
public partial class MainPage
{
public MainPage()
{
InitializeComponent();
MyWebBrowser.Navigate(new Uri("http://robtowns.com/music/"));
}
private async void MyWebBrowser_OnNavigating(object sender, NavigatingEventArgs e)
{
if (!e.Uri.AbsolutePath.EndsWith(".mp3")) return; //Find a more reliable way to detect mp3 files
e.Cancel = true; // Cancel the browser control navigation, and take over from here
MessageBox.Show("Now downloading an mp3 file");
var fileWebStream = await GetStream(e.Uri);
using(var isolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
var filePath = "downloadedfile.mp3";
var localFile = isolatedStorage.CreateFile(filePath);
await fileWebStream.CopyToAsync(localFile.AsOutputStream().AsStreamForWrite());
fileWebStream.Close();
MessageBox.Show("File saved as 'downloadedfile.mp3'");
}
}
public static Task<Stream> GetStream(Uri url)
{
var tcs = new TaskCompletionSource<Stream>();
var wc = new WebClient();
wc.OpenReadCompleted += (s, e) =>
{
if (e.Error != null) tcs.TrySetException(e.Error);
else if (e.Cancelled) tcs.TrySetCanceled();
else tcs.TrySetResult(e.Result);
};
wc.OpenReadAsync(url);
return tcs.Task;
}
}
}