填充ListBox的DataTemplate的更好表现

3

我有一个带有 DataTemplate ListBox 。这个 DataTemplate 是在代码中填充的,但是性能非常差。填充它的方法在构造函数中调用。请告诉我如何改进它。

 <ListBox  ScrollViewer.HorizontalScrollBarVisibility="Visible"
                                  ScrollViewer.CanContentScroll="False"
                                  Name="lbCars"
                                  VirtualizingStackPanel.IsVirtualizing="True" 
                                  VirtualizingStackPanel.VirtualizationMode="Recycling" 
                                  IsSynchronizedWithCurrentItem="True">
                        <ListBox.ItemContainerStyle>
                            <Style TargetType="ListBoxItem">
                                <Setter Property="MaxHeight" Value="100"/>
                            </Style>
                        </ListBox.ItemContainerStyle>
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="auto" />
                                        <ColumnDefinition Width="auto" />
                                        <ColumnDefinition Width="*" />
                                    </Grid.ColumnDefinitions>
                                    <Image Height="auto" Width="125" Source="{Binding car_img_src}" Grid.Column="0" />
                                    <VirtualizingStackPanel Margin="5, 0, 0, 0" Grid.Column="1" Orientation="Vertical" VerticalAlignment="Center">
                                        <TextBlock Text="ID:" FontSize="12"  FontWeight="Bold" Margin="0, 0, 0, 2" />
                                        <TextBlock FontWeight="Bold" FontSize="12" Text="Name:"  Margin="0, 0, 0, 2"/>
                                        <TextBlock FontSize="12" Text="Kategorie:"  FontWeight="Bold" Margin="0, 0, 0, 2"/>
                                        <TextBlock FontSize="12" Text="Tuning:"  FontWeight="Bold"/>
                                    </VirtualizingStackPanel>
                                    <VirtualizingStackPanel Grid.Column="2" Orientation="Vertical" VerticalAlignment="Center" Margin="5, 0, 0, 0">
                                        <TextBlock FontSize="12" Text="{Binding car_id}" Margin="0, 0, 0, 2"/>
                                        <TextBlock FontSize="12" Text="{Binding car_name}" Margin="0, 0, 0, 2"/>
                                        <TextBlock FontSize="12" Text="{Binding car_group}" Margin="0, 0, 0, 2"/>
                                        <TextBlock FontSize="12" Text="{Binding car_tuning}"/>
                                    </VirtualizingStackPanel>
                                </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

现在我要如何填写它:

        public MainWindow() {
        InitializeComponent();
        InitializeRsc();
    }

InitializeRsc:

carList.Add(new carEntry { car_id = 400, car_group = "Off Road", car_img_src = "Resources/cars/Vehicle_400.jpg", car_name = "Landstalker", car_tuning = "Transfender" }); 
... ((about 300-500 others))

我用4个ListBox填充了大约100-200个项目

1个回答

4
以下是我看到的问题:
  1. 你的ListBox实际上没有虚拟化。无论你设置了什么其他属性,设置ScrollViewer.CanContentScroll="False"都会禁用虚拟化。将其改为True应该可以解决此问题。
  2. 在你的ItemTemplate中使用VirtualizingStackPanel是没有必要的。由于每个面板中只有4个TextBlock,并且你只是增加了不必要的开销,因此虚拟化将不起作用。请改用StackPanel

由于在条目下方会出现丑陋的空白区域,因此已禁用ContentScroll。我将编号为2。 - Giraffe
你将通过修复#1看到最大的性能提升。如果我是你,我会将CanContentScroll设置为True,并看看如何解决它引起的其他问题。 - Adi Lester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接