为列表框中的项目创建视图非常慢

时间:2011-12-21 17:33:49

标签: c# windows-phone-7 listbox backgroundworker

我有一个包含大约50个条目的ListBox。每个条目都有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> 

问题是,如果我启动应用程序并滚动到最后,显示enries大约需要5-10秒。更糟糕的是,如果我再次向上滚动,也会发生同样的情况。 如果我在BackgroundWorker线程中下载文件导致UI有时会冻结几秒钟,这种行为会变得更糟。

BackgroundWorker Thread如何影响用户界面? 在使用列表框时,我应该特别注意什么?

编辑:

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;
        }
    }
}

我知道图片的加载在UI线程中运行,但它只需要几毫秒,而且只发生一次。因此,即使这可以解释长的第一个加载期,它应该在以后工作没有问题。

1 个答案:

答案 0 :(得分:1)

什么是Picture*财产?它是外部资源的URL吗?默认情况下,图像解码在UI线程上执行。

Off-thread decoding of images on Mango了解有关图片创建选项的详情。也许它对你有帮助。