我正在创建一个需要UIElement
向Canvas
. 基本上 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。