2011-11-01 38 views
1

我有一個ListBox是數據綁定到一個ObservableCollection和具有複雜ItemContainerStyle(含圖片,進度條和文本)當高度不固定時,CollectionView過濾器會凍結UI嗎?

當我嘗試在它的CollectionView應用過濾器,具有約200個項目的集合,該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上固定高度不是可接受的結果,因爲它會導致垂直滾動條出現在已具有垂直滾動條的控件中

回答

1

在ListBox上固定高度不是可接受的結果,因爲它會導致垂直滾動條出現在已具有垂直滾動條的控件中

這看起來對我來說很可疑。當ListBox的直接父面板不是GridDockPanel(其最後一個孩子是ListBoxLastChildFill=true)時,列表框失去其虛擬化和滾動。隨着虛擬化的消失,列表框會將所有行解除虛擬化,同時這樣做會掛起UI線程。

您的ListBox是否包裹在某種滾動查看器中?不幸的是,如果是這種情況,你將不得不跳過滾動查看器或將固定大小應用到ListBox

如果您希望容器的剩餘空間爲auto-occupy,請通過某些轉換器對父面板的實際高度ptoperty進行一些綁定,併爲該轉換器中的ListBox「計算」所需的Height。這樣,它看起來像ListBox佔據了所有的空間,但實際上已經通過綁定應用了一些固定的高度。

但是,根據情況,這可能會非常棘手!

相關問題