Pergunta

Estou criando e aplicação que precisa adicionar e remover muito UIElement para um Canvas. Basicamente um Canvas contém uma coleção de UIElement e renderiza/atualiza automaticamente na tela, dependendo do que ela contém.

Para evitar ter toneladas de UIElements que se sobrepõem na tela, prefiro adicionar todos eles em um secundário Canvas Em seguida, crie um Image a partir disso (graças a WritableBitmap). Finalmente eu acrescento isso Image na minha corrente Canvas. Ao permitir ter apenas poucas imagens na minha tela, espero ter melhor desempenho. Infelizmente parece que não posso excluir completamente o WritableBitmap, mesmo que eu o defina para null.

O código a seguir ilustra:

//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);

}

Depois de algo como 24 WriteableBitmap Criou um OutsMemoryException parece. Eu li muitos artigos sobre esse problema e, no meu caso, parece o WriteableBitmap depende do meu GraphicCanvas e permanece porque ainda há uma referência a ele. Não consigo excluir minha tela gráfica nem definir minha imagem fonte para nulo.

Eu tenho 2 perguntas:

  • Existe outra maneira de criar uma imagem a partir de tela ou uma coleção de uielamentos?
  • É possível remover a referência quem mantém esse writeablebitmap vivo?

Espero ser suficientemente claro e fácil de ler.

Obrigado pela leitura.

Editado com sugestão de Atomaras, mas ainda assim o mesmo problema

WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null);Essa linha ainda lança outOfMemoryException.

Foi útil?

Solução

Você precisa copiar os pixels do WritEableBitMap original (que se manterem com os GraphicsCanvas) a um novo WritEableBitmap.

Dê uma olhada neste ótimo post http://www.wintellect.com/blogs/jprosise/silverlight-s-big-image-problem-and-what-you--an-about-it

Além disso, por que você mantém todos os WriteableBitMaps na coleção de Uiellements? O mais recente não seria suficiente? Você não pode limpar a coleção UIELEMENTS antes de adicionar o bitmap mais recente/novo?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top