Создание представления для элементов внутри списка очень медленно - PullRequest
0 голосов
/ 21 декабря 2011

У меня есть 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;
        }
    }
}

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

1 Ответ

1 голос
/ 21 декабря 2011

Что такое Picture* свойство?Это URL внешнего ресурса?По умолчанию декодирование изображений выполняется в потоке пользовательского интерфейса.

Подробнее о параметрах создания изображений можно узнать в Внепроцессное декодирование изображений в Mango .Может быть, это поможет вам.

...