2017-03-21 53 views
3

您好我正在使用DataTable綁定數據與列表框 數據錶行計數= 1000+,我必須加載所有行。C#WPF界面凍結,而數據表綁定與列表框

,當我結合

// Inside BackgroundThread 
DataTable table = GetDataFromServer(); // Get Data (DataTable row count = 1000+) 
this.Dispatcher.Invoke(new Action(() => 
{ 
     FilteredList.DataContext = table ; // UI Hangs Progress bar freeze around 20-30+ seconds 

}), DispatcherPriority.Background); 

XML代碼

<Grid Grid.Row="0" x:Name="gridFilteredList" Visibility="Collapsed"> 
      <ListView Style="{DynamicResource MyListView}" Grid.Row="0" AllowDrop="True" x:Name="FilteredList" 
       IsSynchronizedWithCurrentItem="False" ItemsSource="{Binding Mode=OneWay}" 
       BorderThickness="0" BorderBrush="Black" ScrollViewer.ScrollChanged="syncList_ScrollChanged" 
       ItemContainerStyle="{StaticResource BorderedListViewItemStyle}" SelectedItem="{x:Null}" 
       Background="{DynamicResource DefaultMSBackgroundColor}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
       HorizontalContentAlignment="Stretch" ScrollViewer.CanContentScroll="False" Focusable="True" SelectionChanged="syncList_SelectionChanged" SelectionMode="Single" MouseMove="syncList_MouseMove" 
        MouseEnter="syncList_MouseEnter" 
      MouseLeave="syncList_MouseLeave"> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <Grid x:Name="FileItemGrid" Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Cursor="Hand"> 
          <Grid Margin="0 10 10 10" Height="35" > 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="40"/> 
            <ColumnDefinition Width="*"/> 
           </Grid.ColumnDefinitions> 
           <Image Grid.Column="0" Cursor="Hand" Source="{Binding Path=imagestring, Mode=OneWay}" VerticalAlignment="Center" Margin="5,0" HorizontalAlignment="Center" Style="{StaticResource Image32StyleNearestNeighbor}" /> 
           <Grid Grid.Column="1"> 
            <Grid.RowDefinitions> 
             <RowDefinition /> 
             <RowDefinition /> 
            </Grid.RowDefinitions> 
            <Grid Grid.Row="0" > 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="*"/> 
              <ColumnDefinition Width="Auto" /> 
             </Grid.ColumnDefinitions> 
             <TextBlock Grid.Column="0" Cursor="Hand" Foreground="#FF333333" TextTrimming="CharacterEllipsis" TextWrapping="NoWrap" VerticalAlignment="Center" Text="{Binding Path=name, Mode=OneTime}" /> 
             <TextBlock Grid.Column="1" Cursor="Hand" Foreground="#FF333333" TextTrimming="CharacterEllipsis" TextWrapping="NoWrap" VerticalAlignment="Center" Text="{Binding Path=size, Mode=OneTime}" HorizontalAlignment="Right" /> 
            </Grid> 
            <TextBlock Grid.Row="1" FontSize="11" TextTrimming="CharacterEllipsis" VerticalAlignment="Center" > 
            <Run Text="{Binding Path=formattedtime, Mode=OneTime}" Foreground="#FFB3B3B3"/> 
            <Run Text="-"/> 
            <Run Text="{Binding Path=activity, Mode=OneTime}" Foreground="{Binding Path=StatusLabelColour, Mode=OneTime}"/> 
            </TextBlock> 
           </Grid> 
           <Grid Grid.Column="1" Margin="5 0 0 0" HorizontalAlignment="Right" VerticalAlignment="Bottom"> 
            <Grid Visibility="{Binding Path=DeleteImageVisible, Mode=OneWay}" ToolTip="Click to recover file" Name="SyncDelete" 
              Cursor="Hand" MouseLeftButtonDown="SyncDelete_MouseLeftButtonDown" Style="{DynamicResource GridWithBackground}"> 
             <Image x:Name="imgDelete" SnapsToDevicePixels="True" Source="pack://application:,,,/Resources/UserControl/SyncSummary_Delete.png" 
               Style="{StaticResource Image16StyleHighQuality}"/> 
            </Grid> 
            <Image Name="errorImage" VerticalAlignment="Center" Cursor="Hand" HorizontalAlignment="Center" Style="{StaticResource Image16StyleHighQuality}" 
              Source="{Binding Path=errorStringImage, Mode=OneWay}" ToolTip="{Binding Path=errorStringToolTip, Mode=OneWay}" ToolTipService.ShowDuration="50000" UseLayoutRounding="True" /> 
           </Grid> 
           <Button Grid.Column="1" x:Name="btnShare" Content="Share" Click="btnShare_Click" Margin="0,0,10,0" > 
            <Button.Style> 
             <Style TargetType="Button"> 
              <Setter Property="Foreground" Value="White" /> 
              <Setter Property="Height" Value="30" /> 
              <Setter Property="Padding" Value="10,0,10,0" /> 
              <Setter Property="Cursor" Value="Hand" /> 
              <Setter Property="BorderBrush" Value="Black" /> 
              <Setter Property="Background" Value="{DynamicResource DefaultMSForegroundColor}" /> 
              <Setter Property="VerticalContentAlignment" Value="Center" /> 
              <Setter Property="HorizontalContentAlignment" Value="Center" /> 
              <Setter Property="FontWeight" Value="Bold" /> 
              <Setter Property="HorizontalAlignment" Value="Right" /> 
              <Setter Property="Visibility" Value="Collapsed" /> 
              <Style.Triggers> 
               <Trigger Property="IsMouseOver" Value="True"> 
                <Setter Property="Foreground" Value="Black" /> 
               </Trigger> 
               <MultiDataTrigger> 
                <MultiDataTrigger.Conditions> 
                 <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListViewItem}},Path=IsMouseOver, Mode=OneWay}" 
                   Value="True" /> 
                 <Condition Binding="{Binding Path=ShareBtnVisible, Mode=OneWay}" 
                   Value="Visible" /> 
                </MultiDataTrigger.Conditions> 
                <MultiDataTrigger.Setters> 
                 <Setter Property="Visibility" Value="Visible" /> 
                </MultiDataTrigger.Setters> 
               </MultiDataTrigger> 
              </Style.Triggers> 
             </Style> 
            </Button.Style> 
           </Button> 
          </Grid> 
         </Grid> 
        </DataTemplate> 

       </ListView.ItemTemplate> 
      </ListView> 
     </Grid> 

我應該用ObservationCollection或任何其他設計模式爲解決凍結問題?

+1

確保ListBox已被虛擬化。您應該提供可重複的示例:https://stackoverflow.com/help/mcve。不要忘記包含您的XAML標記。 – mm8

+0

一次有很多行對用戶真正有用嗎? – Crowcoder

+0

ya其要求.. –

回答

3

您正在將的ScrollViewer.CanContentScroll附屬屬性設置爲false,該屬性可以有效地禁用內置UI虛擬化,並且會對性能造成負面影響。

如果您關心渲染和滾動性能,請不要將此屬性設置爲false

+1

亞工作良好謝謝@ mm8 ....只是爲了我的知識哪些綁定是更好的性能..直接綁定,我已經用戶或綁定使用ObservationCollection –

+0

我不知道你的意思是「直接」但綁定到ObservableCollection 並綁定到任何其他類型的集合(例如List )之間在性能上沒有明顯差異。但是,如果您有其他問題,請提出一個新問題。 – mm8

+0

我有與綁定有關的性能問題..所以我只需要什麼是最好的綁定方式.. –

2

把你的代碼放在Task(自己的線程)中,你的UI不會再凍結了。在UI線程中調用長時間運行的操作時,您將始終遇到此問題。

+2

在後臺線程上調用長時間運行的GetDataFromServer方法*它是UI渲染緩慢。而且你不能在後臺線程上渲染UI。 – mm8

+0

我應該將這個代碼「List.DataContext = table」移動到任務中嗎? –

+0

我使用任務,但用戶界面竊取冷凍..可以共享示例我使用Task.Factory.StartNew(()=>方法 –