2

我在 WP8 中创建了一个简单的应用程序来使用 Microsoft.Phone.Controls.WebBrowser 类显示网页。我能够加载页面、导航链接、在历史记录中前后移动。除了这个基本功能之外,我还想提供下载无法在浏览器中显示的文件的方法,比如 .ppt 或 .mp3。

我无法在 WebBrowser 类文档中找到任何内容来启动下载。只有一个 Navigate 函数需要一个 URL 来加载。

那么可以使用 WebBrowser 类进行下载吗?

4

1 回答 1

1

您必须拦截导航事件并自行处理。

以下代码示例应为您指明正确的方向。(你会想要完善它,我只是把它放在一起以表明它可以与我搜索测试 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;
        }
    }
}
于 2013-03-11T00:24:03.753 回答