1

以下のコードで写真を読み込もうとしています:

void LoadPictures(int s)
{
    grdScene.Children.Clear();
    TabControl tab = new TabControl();
    for (int i = s; i <= s+3; i++)
    {
        System.Drawing.Bitmap bmp = new System.Drawing.Bitmap("C:\\img\\" + i + ".png");
        TabItem tabItem = new TabItem();
        tabItem.Header = "Scene " + i;
        var bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(),
                                                                    IntPtr.Zero,
                                                                    Int32Rect.Empty,
                                                                    BitmapSizeOptions.FromEmptyOptions());
        Image image = new Image();
        image.Source = bitmapSource;
        tabItem.Content = image;
        tab.Items.Add(tabItem);
    }
    grdScene.Children.Add(tab);//grdScene is Grid
}

正常に動作しますが、このメソッドを実行するたびにメモリが増えます。次に、すべての項目を に設定しようとしましnullたが、成功しませんでした。コードは次のとおりです。

foreach (var child in grdScene.Children)
{
    TabControl tab1 = (TabControl)child;
    foreach (TabItem item in tab1.Items)
    {
        Image img = (Image)item.Content;
        img = null;
    }
    tab1 = null;
}

試しGC.Collect()ましたが何も変わりません。この問題を解決するにはどうすればよいですか?

4

2 に答える 2

2

コードビハインドを介してこれを行うのはなぜですか?

コードの外観から、タブ項目は完全に画像によって取り込まれています。

タブコントロールを画像パス コレクションにバインドし、スタイルを使用して目的の外観を記述するだけで、はるかに簡単になり、WPF コアが画像の読み込みとメモリ管理自体を処理します。


それが使用できない場合、問題は画像の読み込み方法に起因しています。メモリを解放しない安全でない相互運用メソッドを介してそれを行っているため、自分でビットマップを破棄する必要があります.Dispose()

BitmapImage のソースを WPF にロードする方がよいでしょうか?

BitmapImageInterop メソッドではなくコード ビハインドで引き続き使用する場合は、使用することをお勧めします。

それで:

    void LoadPictures(int s)
    {
        grdScene.Children.Clear();
        TabControl tab = new TabControl();
        for (int i = s; i <= s + 3; i++)
        {
            BitmapImage bmp = new BitmapImage(new Uri("C:\\img\\" + i + ".png"));
            TabItem tabItem = new TabItem();
            tabItem.Header = "Scene " + i;
            tabItem.Content = new Image(){Source = bmp};
            tab.Items.Add(tabItem);
        }
        grdScene.Children.Add(tab);
    }

トリックを行う必要があります。

于 2013-04-04T21:26:52.843 に答える
2

または より良い使用..IDisposable _System.Drawing.Bitmapusing

using(var bmp = new System.Drawing.Bitmap("C:\\img\\" + i + ".png"))
{
     .....
}
于 2013-04-04T21:27:26.143 に答える