0

有没有办法创建一个 BitmapImage 作为要在 Blend 2012 Metro Store App(在 Windows 8 上)中使用的示例数据?

我有一个 ViewModel 如下:

public ItemDesignDataVM()
{
   WebThumbnail = new BitmapImage(new Uri(???));
}

public string ItemId { get { return "123456"; } }
public BitmapImage WebThumbnail { get; private set; }

并希望像这样在 Xaml 中绑定到它:

<Page.Resources>
  <DesignData:ItemDesignDataVM x:Key="ItemDesignDataVM" />
</Page.Resources>

<TextBox Text="{Binding ItemId}" />
<Image Source="{Binding WebThumbnail}" />

问题是,无论我将什么传递给 BitmapImage 构造函数,它都无法创建。我也尝试了各种不同的相对路径和绝对路径。

如果我附加到 XDesProc.exe 进程并调试该代码路径,则 BitmapImage.PixelHeight 和 PixelWidth 为 0,我认为这意味着它们尚未加载。

我的绑定是正确的,因为我看到设计器中出现了 ItemId。

任何帮助,将不胜感激。

4

1 回答 1

0

我不知道这是实际代码还是伪代码,但我发现您发布的内容存在一些问题。

首先,您的 WebThumbnail 属性不支持更改通知。由于该属性是在构造函数中设置的,因此您应该没问题,但是如果您稍后决定异步执行此操作,则可以在绑定发生后填充该属性,并且如果没有更改通知,UI 将永远不会更新。

接下来,尽管您已将 ViewModel 创建为页面资源,但我看不到您将其设置为页面的 DataContext 的任何地方。ViewModel 不一定要设置为资源,可以直接在 DataContext 或 d:DataContext 属性上设置。既然你说你看到了 ItemId,你要么有 xaml 或其他地方的代码来将此资源连接到 DataContext,或者你可能在文本框中有一个默认值?

至于为什么 PixelWidth 和 PixelHeight 为零,也许您在调用构造函数之后并且在 BitmapImage 实际上有机会异步下载图像数据之前检查它?这些值实际上可能稍后会被填写,但如果您没有正确设置页面的 DataContext,您将永远看不到图像。

如果实际情况并非如此,则您的 URL 可能存在问题。首先,在线尝试已知图像的 URL。确保 URL 在您的浏览器中有效,然后在代码中尝试。如果 URL 用于本地文件,则需要使用特殊前缀,例如ms-appx:///如果文件嵌入在您的项目中,则ms-appdata:///local/...如果它在您的应用程序本地文件夹,ms-appdata:///roaming/...如果它在您的应用程序漫游文件夹等中(注意 3 个斜杠)。

希望有帮助...

于 2012-09-18T21:22:44.420 回答