WP7 / Silverlight] Привязка удаленных изображений к списку, чтобы пользовательский интерфейс не блокировался

#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. Я вижу. Я попробую еще раз. Но я думаю, вам следует использовать свой инструментарий по умолчанию, потому что демонстрация может быть немного предвзятой, поскольку, как только можно переключиться, изображения уже загружены, и ваш класс может просто использовать кеш браузера.