У меня есть ListBox с около 50 записей. Каждая запись имеет 3 изображения и текст
Это выглядит примерно так
<grid>
<TextBlock x:Name="textBlock" Text="{Binding Title}" Foreground="{Binding Brush}" Grid.Column="1" Margin="8,43,-256,8" FontSize="26.667" FontFamily="Segoe WP" TextWrapping="Wrap" RenderTransformOrigin="0.5,0.5" TextTrimming="WordEllipsis" Width="248" Height="90" HorizontalAlignment="Center" VerticalAlignment="Center" />
<Image x:Name="image2" Source="{Binding Picture3}" Margin="48,8,29,33" RenderTransformOrigin="0.5,0.5" Width="100" Height="100" VerticalAlignment="Center" HorizontalAlignment="Center" />
<Image x:Name="image" Source="{Binding Picture2}" Margin="58,16,18,24" RenderTransformOrigin="0.5,0.5" Width="100" Height="100" HorizontalAlignment="Center" VerticalAlignment="Center" />
<Image x:Name="image1" Source="{Binding Picture1}" Margin="69,25,8,16" RenderTransformOrigin="0.5,0.5" Width="100" Height="100" HorizontalAlignment="Center" VerticalAlignment="Center" />
</grid>
Проблема в том, что если я запускаю приложение и прокручиваю до конца, то для отображения записей требуется около 5-10 секунд. Еще хуже то, что если я снова прокручиваю вверх, происходит то же самое.
Такое поведение ухудшается, если я загружаю файлы в потоке BackgroundWorker, что иногда приводит к зависанию интерфейса на несколько секунд.
Каким образом поток BackgroundWorker может повлиять на пользовательский интерфейс?
И есть ли что-то, что я должен особенно позаботиться при использовании списка?
EDIT:
Свойство Picture является своего рода хаком для создания рабочего DataBinding для изображений
private BitmapImage m_mediumCoverArt = null;
public BitmapImage MediumCoverWithoutDownload
{
get
{
if (m_mediumCoverArt == null)
{
try
{
using (IsolatedStorageFile isoStore =
IsolatedStorageFile.GetUserStoreForApplication())
{
if (!isoStore.FileExists(GlobalVariables.BEAT_COVER_FOLDER + "/" + GetPath.ForCoverArt(this.m_pictureURL + GlobalVariables.MEDIUM_IMAGE_POSTFIX)))
return null;
using (IsolatedStorageFileStream isoStream =
new IsolatedStorageFileStream(GlobalVariables.BEAT_COVER_FOLDER + "/" + GetPath.ForCoverArt(this.m_pictureURL + GlobalVariables.MEDIUM_IMAGE_POSTFIX),
FileMode.Open, isoStore))
{
m_mediumCoverArt = new BitmapImage();
m_mediumCoverArt.SetSource(isoStream);
return m_mediumCoverArt;
}
}
}
catch (Exception)
{
return null;
}
}
else
{
return m_mediumCoverArt;
}
}
}
Я знаю, что загрузка изображений выполняется в потоке пользовательского интерфейса, но это занимает всего миллисекунды, и это происходит только один раз. Поэтому, хотя это может объяснить длительный период первой загрузки, оно должно работать позже без проблем.