Webから受信した画像を保存してWindows Phone 7アプリケーションに表示する方法

私はWindowsの電話7アプリケーションで私の最初のアプリを構築しています。私はウェブから来る画像を持っており、画像がクリックされると別のページに移動します。 私のxamlコードは:

 <button Click="Image_Click" Name="image1" Margin="-33,-16,-26,-13">
            <button.Background>
                
            
        </button>

私の.csコードは

private void Image_Click(object sender, RoutedEventArgs e)
    {
        NavigationService.Navigate(new Uri("/AAP.xaml", UriKind.Relative));
    }

今問題は、オフラインでも見ることができるように画像を保存したいということです。この目的のために私が何をすべきかを教えてください。

0
ru de

1 答え

これを行う方法の実例です。ロジックは次のとおりです。

  1. ページのコンストラクタで LoadImage メソッドを呼び出します。
  2. このメソッドは、ImageBrushのImageSourceを、使用可能な場合は隔離されたストレージにイメージするように設定します。
  3. 画像がIsolatedストレージに存在しない場合、 LoadImage メソッドはウェブから画像をダウンロードし、ダウンロードが完了したらイベントハンドラを呼び出します。
  4. イベントハンドラ( DownloadCompleted メソッド)は、イメージをIsolated Storageに保存し、 LoadImage を再度呼び出します。次に何が起こるかについては、ポイント2を参照してください。

後でMVVMを実装し、DataBindingを使用して改善することをお勧めします。

References: nickharris.net, geekchamp.com

string imageName = "myImage.jpg";
string imageUrl = "http://political-leader.vzons.com/ArvindKejriwal/images/icons/landing.png";

public MainPage()
{
    InitializeComponent();
    LoadImage();
}

private void LoadImage()
{
    BitmapImage bi = new BitmapImage();
    using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
    {
        //load image from Isolated Storage if it already exist
        if (myIsolatedStorage.FileExists(imageName))
        {
            using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(imageName, FileMode.Open, FileAccess.Read))
            {
                bi.SetSource(fileStream);
                imageBrushName.ImageSource = bi;
            }
        }
        //else download image to Isolated Storage
        else
        {
            WebClient wc = new WebClient();
            wc.OpenReadCompleted += new OpenReadCompletedEventHandler(DownloadCompleted);
            wc.OpenReadAsync(new Uri(imageUrl, UriKind.Absolute), wc);
        }
    }
}

private void DownloadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    if (e.Error == null && !e.Cancelled)
    {
        try
        {
            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(imageName);

                BitmapImage bitmap = new BitmapImage();
                bitmap.SetSource(e.Result);
                WriteableBitmap wb = new WriteableBitmap(bitmap);

               //Encode WriteableBitmap object to a JPEG stream.
                Extensions.SaveJpeg(wb, fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
                fileStream.Close();
            }
            //after image saved to Iso storage, call LoadImage method again
            //so the method will set imageBrush's ImageSource to image in Iso storage
            LoadImage();
        }
        catch (Exception ex)
        {
            //Exception handle appropriately for your app  
        }
    }
    else
    {
        //Either cancelled or error handle appropriately for your app  
    }
}
2
追加された
ここでうまくいく。私は、私のPCをインターネットに接続して、アプリケーションを実行するという、私がテストした方法であるオフラインモードを持っていません。インターネットから切断し、アプリとそのイメージを再実行します。
追加された 著者 har07,
必ずしも。実際には、何か悪いことを除いて、他人に行かないでください。デバッグし、ダウンロードが完了したらブレークポイントを入れ、実行がelse/catchブロックに行くかどうかを確認してください。
追加された 著者 har07,
いいえ、問題の投稿と同じ画像をダウンロードしようとしました。変換なしの罰金
追加された 著者 har07,
いいえ。 AFAIKを再起動すると、以前に保存されたデータが隔離されたストレージから消去されます(エミュレータでのみ、実際のWPデバイスを再起動すると同じことは起こりません)
追加された 著者 har07,
この方法で画像を表示できますが、オフラインモードでは画像が表示されません。私は一度オンラインで見た画像を、オフラインで見ることもできるはずです
追加された 著者 bhaku,
elseブロックにいくつかのコードを追加する必要がありますか?
追加された 著者 bhaku,
またはキャッチブロック内
追加された 著者 bhaku,
あなたはpng画像をロードしている間にjpeg画像をロードしています。私はそのコードの何かを変更する必要がありますか?
追加された 著者 bhaku,
インターネット接続なしでエミュレータを閉じてアプリを再実行してみてください
追加された 著者 bhaku,
エミュレータが閉じられていない場合は、イメージを表示することもできます。しかし、エミュレータが閉じられると、私はイメージを見ることができません
追加された 著者 bhaku,