Просмотр BitmapImage для образцов данных в режиме разработки в Blend 2012

Есть ли способ создать BitmapImage в качестве образца данных для использования в приложении Blend 2012 Metro Store (в 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, появляющийся в конструкторе.

Любая помощь будет оценена.

1 ответ

Я не знаю, является ли это реальным кодом или псевдокодом, но я вижу пару проблем с тем, что вы опубликовали.

Во-первых, ваше свойство WebThumbnail не поддерживает уведомления об изменениях. Так как свойство установлено в конструкторе, вы должны быть в порядке, но если позже вы решите сделать это асинхронно, то свойство может быть заполнено после того, как произойдет привязка, и без уведомления об изменении пользовательский интерфейс никогда не будет обновляться.

Далее, хотя вы создали 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 косых черты).

Надеюсь, это поможет...

Другие вопросы по тегам