【发布时间】:2013-01-24 15:17:08
【问题描述】:
我在 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杀死这个对象吗?
当控件不再使用时,我需要一种方法来释放内存。
【问题讨论】:
标签: c# xaml windows-runtime winrt-xaml windows-store-apps