0

我正在创建一个需要UIElementCanvas. 基本上 aCanvas包含一个集合,UIElement并根据它包含的内容自动在屏幕上呈现/更新它。

为了避免UIElements在屏幕上出现大量相互重叠的人,我更喜欢将它们全部添加到辅助设备上,Canvas然后从中创建一个Image(感谢WritableBitmap)。最后,我将它添加Image到我当前的Canvas. 通过允许我的画布上只有少数图像,我希望有更好的性能。WritableBitmap不幸的是,即使我将其设置为 ,我似乎也无法完全删除null

以下代码说明了它:

//My constructor
public  WP8Graphics() 
{
    //Here my collection DataBinded with the Canvas from the Mainpage
    this.UIElements = new ObservableCollection<UIElement>();
    //The secondary Canvas
    GraphicCanvas = new Canvas();
    GraphicCanvas.Height = MainPage.CurrentCanvasHeight;
    GraphicCanvas.Width = MainPage.CurrentCanvasWidth;
}


///This method can be hit thousand times, it basically create a rectangle 
public void fillRect(int x, int y, int width, int height)
{

// some code
// CREATE THE RECTANGLE rect

   GraphicCanvas.Children.Add(rect); // My secondary Canvas



   WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null);
   wb1.Invalidate();

   WriteableBitmap wb2 = new WriteableBitmap((int)MainPage.CurrentCanvasWidth, (int)MainPage.CurrentCanvasHeight);

  for (int i = 0; i < wb2.Pixels.Length; i++)
  {
       wb2.Pixels[i] = wb1.Pixels[i];
  }
  wb2.Invalidate();

  wb1 = null;

  Image thumbnail = new Image();
  thumbnail.Height = MainPage.CurrentCanvasHeight;
  thumbnail.Width = MainPage.CurrentCanvasWidth;
  thumbnail.Source = wb2;



  this.UIElements.Add(thumbnail);

}

WriteableBitmap在创建 24 之类的东西之后会出现OutOfMemoryException。我阅读了很多关于这个问题的文章,就我而言,这似乎WriteableBitmap取决于我的 GraphicCanvas并且仍然存在,因为仍然有对它的引用。我无法删除我的图形画布,也无法将myImage源设置为 null。

我有 2 个问题:

  • 是否有另一种方法可以从 Canvas 或 UIElements 集合创建图像?
  • 是否可以删除使 WriteableBitmap 保持活动状态的引用?

我希望足够清晰和易于阅读。

感谢您的阅读。

用 atomaras 建议编辑,但仍然是同样的问题

WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null); 这一行仍然抛出 OutOfMemoryException。

4

1 回答 1

1

您需要将原始 writeablebitmap(将保留在 GraphicsCanvas)的像素复制到新的 writeablebitmap。

看看这篇很棒的帖子 http://www.wintellect.com/blogs/jprosise/silverlight-s-big-image-problem-and-what-you-can-do-about-it

另外,为什么要将所有可写位图保留在 UIElements 集合中?最新的还不够吗?您不能在添加最新/新位图之前清除 UIElements 集合吗?

于 2013-11-07T07:22:09.353 回答