我需要一些帮助来弄清楚为什么在XAML中绑定图像的两种不同方式的行为方式不同。
这是我的代码:
public class Picture
{
public int ID
{
get;
set;
}
public string ThumbURL
{
get
{
return String.Format("http://"+ App.ServerAdress +"/Pictures/thumbs/{0}.jpg", ID);
}
}
public int ThumbLocal
{
get { return ID; }
}
}
public class ByteImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
using (var store =
IsolatedStorageFile.GetUserStoreForApplication())
{
if (!store.FileExists(value)) return null;
var stream =
store.OpenFile(path, FileMode.Open);
try
{
var image = new BitmapImage();
image.SetSource(stream);
return image;
}
finally
{
stream.Dispose();
}
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
如果我以这种方式绑定图像,它正在工作:
<Image Width="110" CacheMode="BitmapCache" Source="{Binding ThumbURL}"
Margin="12,0,9,0"/>
但这种方式不会:
<Image Width="110" CacheMode="BitmapCache" Source="{Binding ThumbLocal, Mode=TwoWay, Converter={StaticResource imgConverter}}"
Margin="12,0,9,0"/>
当我尝试将照片从一个全景项目设置为另一个时,就会发生这种情况。我的情况我想将一个列表中的图片添加到另一个列表中,当我使用第一种类型的绑定时,一切正常。当我导航到其他页面并导航回来时,它正在工作,图片显示出来。我对这种行为感到有点困惑。
我有什么想法可以解决这个问题吗?
最后我意识到为什么会这样。绑定之前我必须从网上下载图片并将其保存到隔离存储,所有这些过程都是异步的。当我把图片绑定在那里时还没有图片。我试图从隔离存储中绑定现有图片并正确显示。所以,现在我需要像INotifyPropertyChanged
这样的东西。如果我使用IValueConverter
答案 0 :(得分:0)
您可以这样做,如果图像不在隔离存储中 - 您开始下载图像,但只在下载完成时立即返回一个新的BitmapImage - 将图像保存为isosore并将其设置为BitmapImage的源。
类似的东西:
if (!store.FileExists(value))
{
var image = new BitmapImage();
ImageDownloadAndCachingHelper.DownloadImage(path, (s, e) => image.SetSource(e.ImageStream));
return image;
}
由您来实现将本地路径转换为Web URI,下载并调用EventHandler的代码,其中ImageDownloadedEventArgs具有ImageStream。