1

我在 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 杀死这个对象吗?

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

4

2 回答 2

0

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

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

于 2013-01-24T15:18:01.953 回答
0

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

要调查内存泄漏,请检查以下问题:如何调试 Windows 应用商店应用程序中的内存泄漏?

我看到的内存泄漏的最常见原因是从未删除的事件处理程序 - 确保删除您RichTextBlockUnloaded事件中的所有处理程序。还要检查是否禁用了所有动画(例如在动画表情中)。

于 2013-01-24T16:43:47.977 回答