我想創建一個具有相當健壯的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>
它看起來像那兩個ListBoxes在最後是罪魁禍首 - 有沒有辦法顯示這些SL不會窒息的嵌套列表? – 2010-12-17 15:11:46
你有沒有試過在它們上面設置固定的widhts和高度? – Falcon 2010-12-17 15:17:42
是的,也是在第二列def固定在最頂端。 – 2010-12-17 15:25:38