1

ObservableCollectionにデータバインドされ、複雑なItemContainerStyle(画像、プログレスバー、テキストを含む)を持つListBoxがあります

コレクションに約200個のアイテムがあるCollectionViewにフィルターを適用しようとすると、UIが2〜3秒間フリーズします。これは、リストボックスの高さが固定されていない(つまり、拡大が許可されている)場合にのみ発生します。ListBoxの高さが値(例:500)に設定されるとすぐに

<Style x:Key="CollectionStyle" TargetType="{x:Type ListBoxItem}">
        <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Border x:Name="Bd" VerticalAlignment="Center" BorderBrush="Transparent" BorderThickness="1" CornerRadius="3.5" Margin="2" Padding="2">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="50"/>
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <Image Grid.Column="0" Source="{Binding Path=ListIcon}" Width="32" Margin="5,5,0,5" VerticalAlignment="Center" />
                        <Grid Grid.Column="1">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>

                            <StackPanel Orientation="Horizontal" Margin="10,0">
                                <TextBlock Text="{Binding Path=Name}" HorizontalAlignment="Stretch" VerticalAlignment="Center" Style="{StaticResource TextFontStyleTextBlock}" FontSize="14" TextTrimming="CharacterEllipsis" />
                                <TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Center" Text="{Binding Path=Time,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" Style="{StaticResource LabelFontStyleTextBlock}"  TextTrimming="CharacterEllipsis" FontSize="12" Margin="5,0,0,0"/>
                            </StackPanel>

                            <ProgressBar Grid.Row="1" Height="10" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="10,0,10,0" Value="{Binding Percentage, Mode=OneWay, Converter={StaticResource doubleToProgress}}">
                                <ProgressBar.Foreground>
                                    <MultiBinding Converter="{StaticResource ProgressBarColorConverter}">
                                        <Binding Mode="OneWay" Path="Percentage" />
                                        <Binding Mode="OneWay" Path="IsStatic" />
                                    </MultiBinding>
                                </ProgressBar.Foreground>
                            </ProgressBar>

                            <StackPanel Orientation="Horizontal" Grid.Row="2" Margin="10,0,10,0">
                                <Image VerticalAlignment="Center" Visibility="{Binding IsStatic, Converter={StaticResource CollapsedIfFalse}, Mode=OneWay, FallbackValue=Collapsed}" Source="/Common;component/Images/alert.ico" Margin="2,2,2,2"
                                                    RenderOptions.BitmapScalingMode="HighQuality"
                                                   RenderOptions.EdgeMode="Aliased" />
                                <TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Center" Text="{Binding Path=Description,Mode=OneWay}" Foreground="Gray" TextTrimming="CharacterEllipsis" FontSize="11"/>
                            </StackPanel>
                        </Grid>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
<ListBox Grid.Row="0" x:Name="items" ItemsSource="{Binding Path=MyCollection}"
                                 ItemContainerStyle="{StaticResource CollectionStyle}"   />

この凍結を修正する方法はありますか?ListBoxの高さが固定されていると、垂直スクロールバーが既にあるコントロールに表示されるため、許容できる結果ではありません。

4

1 に答える 1

1

ListBoxの高さが固定されていると、垂直スクロールバーが既にあるコントロールに表示されるため、許容できる結果ではありません。

これは私には疑わしいようです。の直接の親パネルがListBox notor GridDockPanel最後の子がListBoxwith LastChildFill=true)の場合、リストボックスは仮想化とスクロールを失います。仮想化が失われると、リストボックスはすべての行を非仮想化し、その間にUIスレッドがハングします。

あなたはListBoxある種のスクロールビューアに包まれていますか?残念ながら、その場合は、スクロールビューアをスキップするか、に固定サイズを適用する必要がありますListBox

リストボックスをauto-occupyコンテナの残りのスペースに配置する場合は、コンバータを介して親パネルの実際の高さの操作にバインドしHeight、そのコンバータのリストボックスに必要な「計算」を行います。このようにすると、ListBoxがすべてのスペースを占めるように見えますが、実際には、バインディングを介して一定の高さで適用されます。

しかし、これは状況に応じて注意が必要な場合があります。

于 2011-11-02T09:10:06.170 に答える