将图像源设置为URI

时间:2011-08-04 11:47:15

标签: c# silverlight windows-phone-7

如果我有一个在线图像链接,并且我想将图像源设置为此uri,我该如何做到最好?我正在尝试的代码如下所示 <Image Name="Poster" Height="400" Width="250" VerticalAlignment="Top" Margin="0,10,8,0"/>

BitmapImage imgSource = new BitmapImage();
imgSource.UriSource = new Uri(movie.B_Poster, UriKind.Relative);
Poster.Source = imgSource;

另外,如果我想缓存此图像以再次加载它,这是怎么做到的? 感谢

3 个答案:

答案 0 :(得分:5)

这是正确的方法。如果要缓存映像以供以后重复使用,可以始终在隔离存储中下载它。将WebClientOpenReadAsync一起使用 - 传递图像URI并将其存储在本地。

WebClient client = new WebClient();
client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
client.OpenReadAsync(new Uri("IMAGE_URL"));

void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();

    using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("image.jpg", System.IO.FileMode.Create, file))
    {
        byte[] buffer = new byte[1024];
        while (e.Result.Read(buffer, 0, buffer.Length) > 0)
        {
            stream.Write(buffer, 0, buffer.Length);
        }
    }
}

阅读它将是另一种方式:

using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("image.jpg", System.IO.FileMode.Open, file))
{
    BitmapImage image = new BitmapImage();
    image.SetSource(stream);

    image1.Source = image;
}

答案 1 :(得分:1)

您已正确完成。

要缓存图片,您可以使用WebClient(最简单)或使用WebRequest - WebResponse机制将其下载到本地文件存储中。然后,下次去设置图像位置时,检查它是否存在于本地。如果是这样,请将其设置为本地文件。如果没有,请将其设置为远程文件并下载。

PS。您需要跟踪这些并删除旧文件,否则您将很快填满手机内存。

答案 2 :(得分:0)

在代码隐藏中设置图像源的方式绝对没问题。另一种选择,如果你使用绑定/ MVVM是使用转换器将你的字符串URL转换为图像源:

public class StringToImageConverter : IValueConverter
{

  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    string url = value as string;
    Uri uri = new Uri(url);
    return new BitmapImage(uri);
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    throw new NotImplementedException();
  }
}