【问题标题】:Metro/Windows 8 + C#/XAML: How to find valid URIs to pictures stored in the Documents Library?Metro/Windows 8 + C#/XAML:如何找到存储在文档库中的图片的有效 URI?
【发布时间】:2012-08-27 10:24:00
【问题描述】:

对于 Windows 8,我创建了一个应用程序,它可以从网络下载图片并将它们存储在用户文档库中以编程方式创建的子文件夹中。

我已将所需的功能和声明添加到应用程序清单中:

  • 作为一项功能启用的文档库
  • 添加了 jpg 的文件类型关联并在声明中标记了“打开是安全的”

启动应用程序时,所有文件夹和文件都已正确创建 - 用户可以从文件系统手动打开它们。

我的挑战如下:当我以编程方式加载所有可用图像并将此图像列表绑定到 XAML 元素时,我需要一个可用于设置图像的 URI“xxx:///yyy/zzz.jpg”来源正确。我尝试了各种模式风格,包括。 “file:///yyy/zzz.jpg”但没有成功。

有没有办法做到这一点,或者根本没有办法?

当图片存储在应用程序数据中时,XAML 对诸如“ms-appdata:///local/zzz.jpg”之类的 URI 感到满意。但我肯定更喜欢将图片存储在用户的库中。

感谢您的帮助!

【问题讨论】:

  • 我不确定用户是否同意您将特定于应用程序的图像放在他们的文档文件夹中。当然,它确实取决于存储的图像,但如果我正在为应用程序下载图像,我会将它们保存在应用程序的本地存储中。您没有提及这些是 chrome 图像还是实际内容,所以我不能说这对我来说是绝对的禁忌。
  • 这些图片实际上是用户创建的内容。它们不是应用程序数据。
  • 如果是用户创建的内容,为什么不通过文件选择器来?
  • 实际上是相反的方向:用户内容已经创建并愉快地驻留在库中。内容已保存,例如一周前。当用户回来时,我希望她能够搜索内容。图片应该是搜索结果的一部分。

标签: c# xaml file-io windows-8 microsoft-metro


【解决方案1】:

如果您要绑定到 Image Source 属性,则无法绑定文件路径。您必须绑定到 BitmapImage 数据类型。如果您直接在代码中设置 Source 属性,则如下所示:

           BitmapImage bitmapImage = new BitmapImage();
            await bitmapImage.SetSourceAsync(fileStream);
            MyImage.Source = bitmapImage;

如果您要绑定到对象列表,则对象需要具有返回 BitmapImage 数据类型的属性(简化 - 您还需要支持 INotifyPropertyChanged):

public class MyDataBoundItem
{
   public BitmapImage MyBindableImage {get;set;}
}

您可以使用这样的代码枚举图片文件夹中的文件...

var picFolder = Windows.Storage.KnownFolders.PicturesLibrary;
var options = new QueryOptions(CommonFileQuery.DefaultQuery,new List<string> { ".png", ".jpg" }) ;
options.FolderDepth = FolderDepth.Deep;

var query = picFolder.CreateFileQueryWithOptions(options);
var files = await query.GetFilesAsync();

诀窍在于,它取决于您希望如何加载数据,是从文件中获取相应的文件到您的每个数据绑定对象中,以便它可以提供 BitmapImage 属性。这是因为 SetSourceAsync 调用是异步的,所以您需要支持 INotifyPropertyChanged 以便绑定对象可以在图像可用时通知 UI。不难,只是不直观。

【讨论】:

  • 非常感谢!这很有帮助!你能说这种方法对数据虚拟化有什么影响吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
相关资源
最近更新 更多