Snapshot
ListBox の ItemsSource にバインドされたオブジェクトの ObservableCollection があります。新しいSnapshot
オブジェクトがコレクションにプッシュされ、コレクションにすでに 3 つの要素が含まれている場合、最後のSnapshot
オブジェクトが削除されます。ただし、削除されたオブジェクトが GC によって収集されることはありません。これを確認するためにGC.Collect()
、コレクションからオブジェクトを削除した後に呼び出し、YourKit Profiler でアプリケーションをプロファイリングしました。6 つSnapshot
のオブジェクトを作成した後、YourKit Profiler はメモリ スナップショットを作成しました。コレクションによって参照されたのは 3 つだけでしたが、 6 つのSnapshot
オブジェクトはすべてまだ有効でした。他の 3 つは System.Windows.EffectiveValueEntry によって参照されました。
コレクションが ListBox の ItemsSource にバインドされていない場合、Snapshot
オブジェクトは期待どおりに収集されます。
System.Windows.EffectiveValueEntry からの参照を取り除くにはどうすればよいですか?
public class Snapshot
{
public BitmapImage PreviewImage { get; set; } // Freezed BitmapImage
public string Path { get; set; }
public string Name
{
get
{
return System.IO.Path.GetFileNameWithoutExtension(Path);
}
}
}
XAML:
<ListBox ItemsSource="{Binding Path=LastCapturedPictures}"
SelectedItem="{Binding Path=SelectedCapturedPicture}" HorizontalAlignment="Stretch"
Margin="0,2,0,0" Grid.Column="1" Grid.Row="3">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Vertical" VerticalAlignment="Center"
HorizontalAlignment="Left"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="5,0,5,0">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Image Source="{Binding Path=PreviewImage}" Width="130" Height="100"
Margin="0,0,0,2" Grid.Row="0" HorizontalAlignment="Left">
<Image.BitmapEffect>
<DropShadowBitmapEffect/>
</Image.BitmapEffect>
</Image>
<TextBlock Text="{Binding Path=Name}" Margin="0,2,0,0" Grid.Row="1"
TextAlignment="Left"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>