Вопрос

Я создаю и приложение, которое должно добавить и удалить много 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.

Это было полезно?

Решение

Вам необходимо скопировать пиксели оригинальной riseablebitmap (который будет держаться за GraphicsCanvas) в новую riseablebitmap.

Взгляните на этот замечательный пост http://www.wintellect.com/blogs/jprosise/silverlight-s-big-image-problem-and-what-you-can-do-about-it

Кроме того, почему вы сохраняете все письменные карты в коллекции Ueelements? Разве последнее не хватит? Вы не можете очистить коллекцию Ueelements прямо перед добавлением последней/новой растровой карты?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top