5

SnapshotListBox の 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>
4

1 に答える 1