C# CollectionView过滤器在高度不固定时冻结UI?

C# CollectionView过滤器在高度不固定时冻结UI?,c#,wpf,filter,listbox,collectionview,C#,Wpf,Filter,Listbox,Collectionview,我有一个列表框,它被数据绑定到一个ObservableCollection,有一个复杂的ItemContainerStyle(带有图像、进度条和文本) 当我尝试在其CollectionView上应用过滤器时,集合中大约有200个项目,UI将冻结2-3秒。只有当列表框的高度不固定(即允许增长)时,才会发生这种情况。当列表框高度设置为一个值时,它是即时的,例如500 <Style x:Key="CollectionStyle" TargetType="{x:Type ListBoxItem}"

我有一个列表框,它被数据绑定到一个ObservableCollection,有一个复杂的ItemContainerStyle(带有图像、进度条和文本)

当我尝试在其CollectionView上应用过滤器时,集合中大约有200个项目,UI将冻结2-3秒。只有当列表框的高度不固定(即允许增长)时,才会发生这种情况。当列表框高度设置为一个值时,它是即时的,例如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}"   />

有办法解决这个问题吗?在列表框上具有固定高度是不可接受的结果,因为它会导致在已经具有垂直滚动条的控件中显示垂直滚动条

在列表框上具有固定高度是不可接受的结果,因为它会导致在已经具有垂直滚动条的控件中显示垂直滚动条

我觉得这很可疑。当
列表框的直接父面板不是
网格
DockPanel
(其中最后一个子面板是带有
LastChildFill=true
列表框
)时,列表框将松开其虚拟化和滚动。由于虚拟化丢失,listbox将取消所有行的虚拟化,同时挂起UI线程

您的
列表框是否包装在某种滚动查看器中?不幸的是,如果是这种情况,您将不得不跳过滚动查看器或对
列表框应用固定大小

如果希望列表框自动占用容器的剩余空间,请通过某个转换器绑定到父面板的实际高度p属性,并为该转换器中的列表框“计算”所需的
高度。这样,它看起来就像ListBox占据了所有空间,但实际上是通过绑定以固定高度应用的

但根据实际情况,这可能会很棘手

在列表框上具有固定高度是不可接受的结果,因为它会导致在已经具有垂直滚动条的控件中显示垂直滚动条

我觉得这很可疑。当
列表框的直接父面板不是
网格
DockPanel
(其中最后一个子面板是带有
LastChildFill=true
列表框
)时,列表框将松开其虚拟化和滚动。由于虚拟化丢失,listbox将取消所有行的虚拟化,同时挂起UI线程

您的
列表框是否包装在某种滚动查看器中?不幸的是,如果是这种情况,您将不得不跳过滚动查看器或对
列表框应用固定大小

如果希望列表框自动占用容器的剩余空间,请通过某个转换器绑定到父面板的实际高度p属性,并为该转换器中的列表框“计算”所需的
高度。这样,它看起来就像ListBox占据了所有空间,但实际上是通过绑定以固定高度应用的

但根据实际情况,这可能会很棘手