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>

は、実行時にコード ビハインドからCollectionViewSourcesome に設定されています。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生成された要素の一部には、タイマーイベントによって 200 ミリ秒ごとに呼び出される -function を持つ Canvas-Elements を含めることができます。このイベントバインディングは、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

を として使用できますし、使用する必要がありRichTextBlockますItemTemplate。添付された動作または添付された依存関係プロパティを調査してRichTextBlock、BB コード形式のメッセージをRichTextBlockコンテンツに変換するプロパティを に追加する方法を見つけます。RichTextBlockハイパーリンク テキストをWinRT XAML ツールキットの に追加する例は、こちら で確認できます

メモリ リークを調査するには、次の質問を確認してください: Windows ストア アプリでメモリ リークをデバッグする方法は?

RichTextBlock私が目にするメモリ リークの最も頻繁な原因は、決して削除されないイベント ハンドラーです。のイベントのすべてのハンドラーを必ず削除してくださいUnloaded。また、すべてのアニメーションを無効にしているかどうかも確認してください (例: アニメーション化された絵文字)。

于 2013-01-24T16:43:47.977 に答える