【问题标题】:Memory leaks while scrolling in WPF VirtualizingStackPanel在 WPF VirtualizingStackPanel 中滚动时内存泄漏
【发布时间】:2015-03-18 10:12:12
【问题描述】:

我正在使用 VirtualizingStackPanel 和 textBlock,我的 XAML 代码如下所示,

<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 来跟踪泄漏。这就是我在托管堆中看到的

它显示ConditionalWeakTable&lt;Object,Object&gt; 计数在滚动时增加。有没有办法解决这个问题? 出于某种原因,我不想设置

VirtualizingStackPanel.VirtualizationMode="Recycling"

【问题讨论】:

    标签: wpf memory-leaks


    【解决方案1】:

    ItemsControl 上设置VirtualizingStackPanel.VirtualizationMode="Recycling" 以避免内存泄漏。我在这种情况下遇到了同样的问题,设置 VirtualizingStackPanel.VirtualizationMode="Recycling" 解决了这个问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2011-03-19
      相关资源
      最近更新 更多