#c# #windows-phone-7 #silverlight-4.0 #listbox #windows-phone-7.1
#silverlight #windows-phone-7
Вопрос:
(Сценарий: Windows Phone 7 / Silverlight)
У меня есть список, который я упрощу до этого XAML:
<ListBox ItemsSource="{Binding Path=ImageLinks}"> <!-- ImageLinks a collection in ViewModel -->
<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="{Binding Path=ImageSource}" /> <!-- ImageSource is a string with the url to the image-->
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Теперь приведенный выше код работает, но проблема в том, что при визуализации / загрузке элемента или чего-то еще он начинает загружать изображение, но при этом блокирует пользовательский интерфейс. И поскольку одновременно помещается более одного элемента, пользовательский интерфейс блокируется до тех пор, пока не будут загружены все соответствующие изображения.
Итак, вопрос в том, как мне получить эту функциональность, не блокируя пользовательский интерфейс при загрузке изображений (и избегая повторной загрузки всех из них при каждом переходе к просмотру) ?.
Заранее спасибо.
Проблема решена, спасибо всем, кто нашел время, чтобы помочь мне.
Ответ №1:
Задержка создала решение именно этой проблемы.
Смотрите Его запись в блоге по этой теме на http://blogs.msdn.com/b/delay/archive/2010/09/02/keep-a-low-profile-lowprofileimageloader-helps-the-windows-phone-7-ui-thread-stay-responsive-by-loading-images-in-the-background.aspx
Комментарии:
1. Однако следует отметить одну вещь. Когда я впервые попробовал элемент управления, я добавил его на страницу xaml с соответствующими образцами данных. Поскольку я заменил свой <Источник изображения =»{Путь привязки = Источник изображения}» /> на UriSource=»{Путь привязки = ImageSource}» /> Visual Studio (2010 Express для Windows Phone с сентября. 16) сбой, пока я не удалил xmln, ссылающиеся на образец данных
2. Спасибо за совет! Код был обновлен новыми функциями, и новая версия доступна здесь: blogs.msdn.com/b/delay/archive/2010/10/04 /…
Ответ №2:
Вы могли бы заполнить ImageLinks
вторичный поток, который не привязан к пользовательскому интерфейсу, и привязать его непосредственно из исходного кода после его заполнения вместо прямой привязки к XAML.
Комментарии:
1. Спасибо за ваше предложение, я думаю, я понимаю, что вы имеете в виду (хотя ImageLinks — это список, а ImageSource — строка). Вы хотите, чтобы я, возможно, использовал ImageSource в виде растрового изображения вместо строки и заполнял его, прежде чем привязывать его к Listbox. Проблема в том, что я сохраняю модель с изолированным хранилищем, которое не позволяет мне иметь свойство типа BitmapImage (ну, я не упомянул об этом, извините). Я думал о чем-то подобном раньше, но заканчивал загрузку каждого изображения при каждом переходе к просмотру.
2. Вы можете заполнить
List
то, что у вас есть, в отдельном потоке. Фактически,ImageSource
может быть привязанSetBinding
следующим образом:ListBoxName.SetBinding(ListBox.ItemsSourceProperty, b);
где b — экземплярBinding
.
Ответ №3:
Вы также можете использовать класс PersistentImageCache из моего инструментария Kawagoe, который был разработан именно для этого варианта использования. Дайте мне знать, если это поможет!
Комментарии:
1. Спасибо. я не знаю, делаю ли я что-то не так, но я играл с демонстрационным проектом из вашего инструментария в эмуляторе WP7, и при первом запуске приложения пользовательский интерфейс блокируется на несколько секунд, пока (я думаю) он загружает самые первые элементы. После этого я могу плавно прокручивать несколько элементов, изображения которых были загружены, но когда я снова добираюсь до элементов, у которых еще нет изображений, пользовательский интерфейс снова блокируется. Конечно, если позволить приложению загружать всю коллекцию, выходить и повторно входить, все хорошо и гладко, НО все это именно то поведение, которое я получаю с помощью метода, который я уже использую.
2. Демонстрационный проект по умолчанию использует загрузчик системных образов; он переключается на PersistentImageCache, как только вы нажмете кнопку «постоянный» в верхней части страницы. Похоже, я мог бы прояснить ситуацию здесь …
![]()
3. Я вижу. Я попробую еще раз. Но я думаю, вам следует использовать свой инструментарий по умолчанию, потому что демонстрация может быть немного предвзятой, поскольку, как только можно переключиться, изображения уже загружены, и ваш класс может просто использовать кеш браузера.