2015-03-18 3 views
1

Am используя VirtualizingStackPanel и TextBlock, мой XAML код выглядит ниже,утечки памяти во время прокрутки в WPF VirtualizingStackPanel

<Grid> 
    <ItemsControl Name="NameItemsControl" 
VirtualizingStackPanel.IsVirtualizing="True" 
ScrollViewer.CanContentScroll="True" 
ItemsSource="{Binding Path=NameList}"> 

     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=TaskName}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.Template> 
      <ControlTemplate> 
       <Border> 
        <ScrollViewer> 
         <ItemsPresenter /> 
        </ScrollViewer> 
       </Border> 
      </ControlTemplate> 
     </ItemsControl.Template> 
    </ItemsControl> 
</Grid> 

В .cs я есть ниже код,

public partial class MainWindow : Window 
{ 
    private List<Task> Tasks; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Tasks = new List<Task>(); 

     for (int i = 1; i < 1000; i++) 
     { 
      Task task = new Task() { TaskName = "Task " + i, Id = i, Size = 20 }; 

      Tasks.Add(task); 
     } 
     NameItemsControl.ItemsSource = Tasks; 
    } 
} 
public class Task 
{ 
    public string TaskName { get; set; } 
    public int Id { get; set; } 
    public int Size { get; set; } 
} 

Я могу видеть утечку памяти в то время как прокрутка, я использую VS 2013 Performance and Diagnostics для отслеживания утечки. Это то, что я вижу в управляемой куче enter image description here

Это показывает, что число ConditionalWeakTable<Object,Object> увеличивается при прокрутке. Есть ли способ исправить эту проблему? По какой-то причине я не хочу, чтобы установить

VirtualizingStackPanel.VirtualizationMode="Recycling" 

ответ

0

Установите VirtualizingStackPanel.VirtualizationMode="Recycling" на ItemsControl, чтобы избежать утечки памяти. У меня была такая же проблема в этом сценарии, и установка VirtualizingStackPanel.VirtualizationMode="Recycling" разрешила проблему.

<ItemsControl Name="NameItemsControl" 
VirtualizingStackPanel.VirtualizationMode="Recycling" 
ScrollViewer.CanContentScroll="True" 
ItemsSource="{Binding Path=NameList}"> 
Смежные вопросы