Я создаю и приложение, которое должно добавить и удалить много UIElement
в Canvas
Анкет В основном а Canvas
содержит коллекцию 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);
}
После чего -то вроде 24 WriteableBitmap
создал а OutofmemoryException появляется. Я прочитал много статей об этой проблеме, и в моем случае это кажется WriteableBitmap
зависит от моего GraphicCanvas и остается потому, что все еще есть ссылка на это. Я не могу удалить свой графический холст и установить myImage Источник в NULL.
У меня есть 2 вопроса:
- Есть ли другой способ создать изображение с холста или коллекция Ueelements?
- Можно ли удалить ссылку, кто сохраняет эту писательную писательную карту?
Я надеюсь, что будет достаточно ясным и легко читать.
Спасибо за чтение.
Отредактировано с предложением Atomaras, но все же такая же проблема
WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null);
Эта линия все еще бросает OutofmemoryException.