2

Microsoft.Phone.Controls.WebBrowserクラスを使用してWebページを表示するための簡単なアプリをWP8で作成しました。ページを読み込んだり、リンクをナビゲートしたり、履歴を前後に移動したりできます。この基本的な機能とは別に、.pptや.mp3などのブラウザ内で表示できないファイルをダウンロードする手段も提供したいと思います。

ダウンロードを開始するためのWebBrowserクラスのドキュメントに何も見つかりませんでした。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 に答える