我在 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 不会在这里改变任何东西。
在更改源之前,我尝试遍历旧项目并删除它们。
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
-function 的 Canvas-Elements,它每 200 毫秒被计时器事件调用一次。这个事件绑定可以防止 GC 杀死这个对象吗?
当控件不再使用时,我需要一种释放内存的方法。