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
some に設定されています。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 がこのオブジェクトを強制終了するのを防ぐことができますか?
コントロールが使用されなくなったときに、メモリを解放する方法が必要です。