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()

你最好这样做:在 WPF 中加载 BitmapImage 的源代码?

BitmapImage如果您想继续在代码隐藏而不是互操作方法中进行操作,使用可能是更好的方法。

所以:

    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

尝试在所有s 上调用DisposeIDisposable,例如System.Drawing.Bitmap或更好地使用using..

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