首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可怕的Silverlight性能-- ListBox

可怕的Silverlight性能-- ListBox
EN

Stack Overflow用户
提问于 2010-12-17 23:08:08
回答 2查看 1.5K关注 0票数 3

我正在尝试创建一个具有相当健壮的DataTemplate的ListBox。问题是,性能是难以想象的缓慢。在我的家用计算机上-大约有2.5年的历史,绑定80行大约需要4-6秒。在我的工作计算机(64位/双核)上,时间降到了大约2.5秒,但看起来仍然很慢( 150行大约需要4-5秒)

所有数据都是纯POCO,具有随机生成的数据。这个应用程序中绝对没有任何服务(目前)。数据的随机生成根本不会占用任何时间--我(粗略地说)是在数据创建之后,就在ObservableCollection更新之前执行一次MessageBox.Show。(我甚至尝试绑定到一个普通的旧列表-甚至更慢)。另外,我在Chrome和IE上都试过了。

好的,这是代码,如果我遗漏了什么,让我知道。就像我说的,它是一个健壮的DataTemplate,但我认为这就是SL / WPF的意义所在--他们可以像这样做很酷的事情。我当然希望我做错了什么--这些是我传递的孩子大小的数据量。

编辑-只是把答案放在前面,你没有理由告诉ListBox使用StackPanel作为ItemsPanelTemplate -它默认情况下垂直堆叠显示项目,而且,不仅指定这样的StackPanel是多余的,它还会完全破坏性能。我删除了ItemsPanelTemplate,它工作得很好。

代码语言:javascript
复制
<ListBox ItemsSource="{Binding Path=BookSource_oc}" ItemTemplate="{StaticResource BookDataTemplateMedium}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" HorizontalAlignment="Stretch">
       <ListBox.ItemsPanel>
           <ItemsPanelTemplate>
               <StackPanel Margin="2" HorizontalAlignment="Stretch" x:Name="stackPanelItemsPanel">
               </StackPanel>
            </ItemsPanelTemplate>
       </ListBox.ItemsPanel>
</ListBox>

来自app.XAML:

代码语言:javascript
复制
    <DataTemplate x:Key="BookDataTemplateMedium">
        <Border CornerRadius="3" BorderThickness="2" BorderBrush="Black" Background="White">
            <Grid Margin="3">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="140"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <!-- removing this just to be sure it's not cause of bad perf <Image Grid.Column="0" Stretch="None" VerticalAlignment="Center" HorizontalAlignment="Left" Source="{Binding MediumImgURI}" Margin="7,0,0,0"/>-->
                <StackPanel HorizontalAlignment="Left" Grid.Column="1" Margin="5,0,10,0">
                    <TextBlock FontWeight="Bold" TextTrimming="WordEllipsis" Foreground="Black" ToolTipService.ToolTip="{Binding CurrentBook.Title}" Text="{Binding CurrentBook.Title}"/>
                    <Grid Margin="0,10,0,0">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="200"></ColumnDefinition>
                            <ColumnDefinition Width="270"></ColumnDefinition>
                            <ColumnDefinition Width="270"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="150"></RowDefinition>
                        </Grid.RowDefinitions>
                        <StackPanel Grid.Column="0">
                            <local:vwAmazonReviewsRightToLeft></local:vwAmazonReviewsRightToLeft>
                            <local:vwPublisherInfoWithDateLeftToRight Margin="0,5,0,0"></local:vwPublisherInfoWithDateLeftToRight>
                            <local:vwPagesInfo></local:vwPagesInfo>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock>Is Read </TextBlock>
                                <Image Margin="8,0,0,0" Stretch="None" Source="{Binding IsReadImgUri, Mode=OneWay}"></Image>
                            </StackPanel>
                            <HyperlinkButton Margin="0,5,0,0" NavigateUri="http://www.google.com" Content="View at Amazon"/>
                        </StackPanel>

                        <ListBox Grid.Column="1" Margin="0,2,0,0" ScrollViewer.HorizontalScrollBarVisibility="Disabled" VerticalAlignment="Top" BorderThickness="0" ItemsSource="{Binding CurrentBook.Subjects}" ItemTemplate="{StaticResource dataTemplateSubjectsLB}" />
                        <ListBox Grid.Column="2" Margin="10,2,0,0" ScrollViewer.HorizontalScrollBarVisibility="Disabled" VerticalAlignment="Top" BorderThickness="0" ItemsSource="{Binding CurrentBook.Authors}" ItemTemplate="{StaticResource dataTemplateAuthorsLB}" />
                    </Grid>
                </StackPanel>
            </Grid>
        </Border>
    </DataTemplate>

    <DataTemplate x:Key="dataTemplateSubjectsLB">
        <StackPanel>
            <StackPanel Orientation="Horizontal">
                <Image Source="Img/Bullets/Bullet_Purple.png"></Image>
                <TextBlock ToolTipService.ToolTip="{Binding Name}" Text="{Binding Name}"></TextBlock>
            </StackPanel>
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="dataTemplateAuthorsLB">
        <StackPanel>
            <StackPanel Orientation="Horizontal">
                <Image Source="Img/Bullets/Bullet_Red.png"/>
                <TextBlock ToolTipService.ToolTip="{Binding Name}" Text="{Binding Name}"/>
            </StackPanel>
        </StackPanel>
    </DataTemplate>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-18 01:32:04

您已将默认VirtualPanel更改为StackPanel。为了获得更好的性能,我建议使用默认的ItemsPanel。

票数 2
EN

Stack Overflow用户

发布于 2010-12-17 23:14:08

以下是性能不佳的两个最常见的原因:

难以计算的

  • 布局(很可能是您的示例中的情况)。尝试设置固定的宽度和高度,避免像DropShadow这样在软件中呈现的stretches.
  • Graphics-Effects :也许像Amazon-View这样的组件会使用它们

您可以随时使用性能工具,如Wpf Performance Suite中的穿孔器来挖掘问题。它肯定会帮你找到瓶颈!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4471788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档