删除旧生成的ListView条目

时间:2013-01-24 15:17:09

标签: c# xaml windows-runtime winrt-xaml windows-store-apps

我在XAML中有一个ListView-Control:

<ListView x:Name="conversationContent" Grid.Column="2" Margin="20,0,0,20" FontFamily="Global User Interface" >
    <ListView.Resources>
        <CollectionViewSource x:Name="conversationContentSource" IsSourceGrouped="False" />
        <DataTemplate x:Key="DataTemplate1">
            <Grid HorizontalAlignment="Stretch">
                <Border x:Name="messageBorder" BorderBrush="Black" BorderThickness="1" Margin="0" CornerRadius="2" VerticalAlignment="Center" HorizontalAlignment="{Binding MTY, Converter={StaticResource messageAlignment}}" Child="{Binding MSG, Converter={StaticResource messageToRTF}}" />
            </Grid>
        </DataTemplate>
    </ListView.Resources>
    <ListView.ItemsSource>
        <Binding Mode="OneWay" Source="{StaticResource conversationContentSource}"/>
    </ListView.ItemsSource>
</ListView>

CollectionViewSource在运行时从代码隐藏设置为某些ObservableCollection<Message>

转换器正在解析ObservableCollection中的每个项目,它将完整的消息(包括BB代码)转换为单个RichTextBlock - 元素,其中包含其他UI元素。

有时,CollectionViewSource.Source-Property更改为另一个ObersableCollection<Message>。发生这种情况时,ListView-Control会构建新的ItemList并显示它。至于好。

问题是,旧的项目不会从内存中删除。手动运行GC不会改变任何内容。

我尝试迭代旧项目并在更改Source之前删除它们。

for (int ix = conversationContent.Items.Count - 1; ix >= 0; ix--) {
    Debug.WriteLine("Type: " + conversationContent.Items.ElementAt(ix));
    if (conversationContent.Items.ElementAt(ix) is RichTextBlock) {
        conversationContent.Items.RemoveAt(ix);
    }
}

但是,只有“消息”类型的对象,而不是RichTextBlock-Controls。为什么呢?

我需要说的是,一些生成的元素可以包含带有update函数的Canvas-Elements,它由timer-event每200ms调用一次。这个事件-Binding可以阻止GC杀死这个对象吗?

当控件不再使用时,我需要一种释放内存的方法。

2 个答案:

答案 0 :(得分:0)

首先,您应该尝试使用UI虚拟化 - &gt; http://blogs.southworks.net/dschenkelman/2009/01/29/how-to-show-large-amounts-of-data-in-wpf-using-ui-virtualization/

这样,ListView将回收用于呈现数据的控件,并且不会使用那么多内存。

答案 1 :(得分:0)

您可以而且应该使用RichTextBlock作为ItemTemplate。研究附加的行为或附加的依赖属性,以找出如何将属性添加到RichTextBlock,将您的BB代码格式的消息转换为RichTextBlock内容。您可以在WinRT XAML工具包here中看到一个将超链接文本添加到RichTextBlock的示例。

要调查内存泄漏,请检查此问题:How to debug memory leaks in Windows Store apps?

我发现内存泄漏的最常见原因是永远不会删除的事件处理程序 - 请务必删除RichTextBlock Unloaded事件中的所有处理程序。同时检查是否禁用所有动画(例如,在动画表情符号中)。