2010-12-17 91 views
3

我想创建一个具有相当健壮的DataTemplate的列表框。问题是,性能是无法想象的缓慢。在我的家用电脑上 - 大约2.5岁,约需要4-6秒来绑定80行。在我工作的计算机上(64位/双核),时间降低到大约2.5秒,但仍然 - 看起来非常慢(150行约需4-5秒)可怕的Silverlight性能 - 列表框

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

好的,这是代码,如果我遗漏了任何东西,请告诉我。就像我说的那样,这是一个强大的DataTemplate,但我认为这是SL/WPF的重点 - 他们可以做这样的酷事。我当然希望我做错了什么 - 这些都是我通过的大小的数据。

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

<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中:

<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> 
+0

它看起来像那两个ListBoxes在最后是罪魁祸首 - 有没有办法显示这些SL不会窒息的嵌套列表? – 2010-12-17 15:11:46

+0

你有没有试过在它们上面设置固定的widhts和高度? – Falcon 2010-12-17 15:17:42

+0

是的,也是在第二列def固定在最顶端。 – 2010-12-17 15:25:38

回答

2

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

1

这是两个对表现不佳的最常见的原因:

  • 布局难以计算(这是最有可能的在你的例子中)。尝试设置固定的宽度和高度并避免延伸。
  • 图形,特效像阴影效果,这是在软件渲染:也许就像亚马逊 - 视图组件使用它们

您可以随时使用绩效的工具,比如穿孔从Wpf Performance Suite挖成问题。它会帮助你找到确切的瓶颈!

+0

好吧,看起来好像这两个列表框在最后都是SL所窒息的。我删除它们,它运行炽烈。我甚至试图从它们中删除所有模板,所以它们只显示类名,但仍然很慢。由于SL似乎讨厌在列表框中放置一个列表框,有没有其他方法可以实现我的目标? (我也给他们添加了一个固定的宽度,仍然没有效果) – 2010-12-17 15:20:54

+0

此外,该perf工具似乎只适用于WPF - 是否有Silverlight版本?这不会帮助我,因为我认为我已经明确了问题所在,但稍后它可能会派上用场。 – 2010-12-17 15:22:17