4

我已经从网上下载了图像并将它们保存到独立存储中,现在我想在我的 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>

PodcastLogoUri是绑定到 BitmapImage.UriSource 的 Uri 值:

“isostore:/PodcastIcons/258393889fa6a0a0db7034c30a8d1c3322df55696137611554288265.jpg”

这是我构建它的方式:

public Uri PodcastLogoUri
{
    get
    {

        Uri uri = new Uri(@"isostore:/" + PodcastLogoLocation);
        return uri;
    }
}

不过,我在我的 UI 中看不到图像。而且我确信图像位于PodcastLogoLocation.

是否可以像在 Windows Phone 8 中这样从隔离存储中将图像引用到 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;
     }
 }
4

2 回答 2

5

我想我已经做了和你想做的一模一样的事情。我发现的是独立存储使用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.视图模型

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 });
于 2014-07-02T14:08:34.930 回答
2

可悲的是,这似乎毕竟是不可能的。我对此感到有点震惊和失望。无法真正理解MS如何不支持这种情况。

这是我在 MSDN 论坛上得到的答案:

它不支持直接从具有 ISOStore URI 方案的隔离存储中绑定 XAML。

这是您的答案的详细答案。

http://mark.mymonster.nl/2013/05/24/yeah-windows-phone-supports-isolated-storage-access-through-an-uri-scheme-does-it

就是这样了。

于 2013-08-11T12:49:56.253 回答