使用“;isostore:/“;计划
本文关键字:计划 isostore 使用 | 更新日期: 2023-09-27 18:27:12
我已经从web下载了图像并将它们保存到独立存储中,现在我想访问XAML文件中的这些图像,并提供一个Uri作为对它们的引用。
我已经用IsoStoreSpy验证了它们是否正确存储在我期望的位置,如果我打开文件并读取字节流,我可以从中创建BitmapImages。但现在我想优化我的图像处理,只将一个Uri从我的模型传递到IsolatedStorage位置,并让我的XAML加载图像。
<Image Height="120" Width="120" Stretch="Uniform" HorizontalAlignment="Left">
<Image.Source>
<BitmapImage UriSource="{Binding PodcastLogoUri}" DecodePixelHeight="120" DecodePixelWidth="120" />
</Image.Source>
</Image>
这是绑定到BitmapImage.UriSource的PodcastLogoUri
Uri值:
"isostore:/PodcastIcons/25893889fa6a0a0db7034c30a8d1c3322df55696137611554288265.jpg"
以下是我构建它的方式:
public Uri PodcastLogoUri
{
get
{
Uri uri = new Uri(@"isostore:/" + PodcastLogoLocation);
return uri;
}
}
不过,我在UI中看不到任何图像。我确信图像在PodcastLogoLocation
。
是否可以像在WindowsPhone8中这样从隔离存储中将图像引用到UI?我做错了什么?
编辑:如果我使用相同的路径直接创建BitmapImage并在XAML中使用BitmapImage,它运行良好,我可以在那里看到我希望看到的图像:
<Image Height="120" Source="{Binding PodcastLogo}" Width="120" Stretch="Uniform" HorizontalAlignment="Left"/>
public BitmapImage PodcastLogo
{
get
{
Stream stream = null;
BitmapImage logo = new BitmapImage();
using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if (isoStore.FileExists(PodcastLogoLocation))
{
stream = isoStore.OpenFile(PodcastLogoLocation, System.IO.FileMode.Open, FileAccess.Read);
try
{
logo.SetSource(stream);
}
catch (Exception e)
{
}
}
}
return logo;
}
}
我想我已经做了与您尝试做的完全相同的事情。我发现的是独立存储使用IsolatedStorageFile.GetUserStoreForApplication()
存储文件的绝对位置。这有点像"C:/Data/Users/DefApps/AppData/<App Product ID>/Local/<YourFile.png>"
;
我已经在Windows Phone 8上测试了这个解决方法,它对我有效…
1.XAML
<Image Width="40">
<Image.Source>
<BitmapImage DecodePixelWidth="40" DecodePixelHeight="40" UriSource="{Binding Path=Icon}" />
</Image.Source>
</Image>
2.ViewModel
private string _icon;
public string Icon
{
get
{
return _icon;
}
set
{
if (value != _icon)
{
_icon = value;
NotifyPropertyChanged("Icon");
}
}
}
3.加载数据
filename = "Myicon.png";
IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
if (!store.FileExists(filename))
{
using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(filename, FileMode.Create, FileAccess.Write, store))
stream.Write(imgBytes, 0, imgBytes.Length);
}
//get Product ID from manifest. Add using System.Linq; if you haven't already
Guid productId = new Guid((from manifest in System.Xml.Linq.XElement.Load("WMAppManifest.xml").Descendants("App") select manifest).SingleOrDefault().Attribute("ProductID").Value);
string storeFile = "C:/Data/Users/DefApps/AppData/" + productId.ToString("B") + "/Local/" + filename;
this.Items.Add(new MyViewModel() { Icon = storeFile });
遗憾的是,这似乎根本不可能。我对此感到有点震惊和失望。我真的不明白MS怎么不支持这个案子。
这是我在MSDN论坛上得到的答案:
它将不支持直接从具有ISOStore URI方案。
以下是您的详细答案。
http://mark.mymonster.nl/2013/05/24/yeah-windows-phone-supports-isolated-storage-access-through-an-uri-scheme-does-it
就是这样。