我在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杀死这个对象吗?
当控件不再使用时,我需要一种释放内存的方法。
答案 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
事件中的所有处理程序。同时检查是否禁用所有动画(例如,在动画表情符号中)。